Передача массива, содержащего указатели на функцию правильно

Код:

/*
 * code.c
 */
#include <stdio.h>

void printArray(int iXArray, int iSize);

int main() {
    int array1[] = {7, 9, 3, 18};
    int *array2[] = {array1 + 0, array1 + 1, array1 + 2, array1 + 3};

    printArray(array2, 4);

    return 0;
}

// This should print the values in array1
void printArray(int iXArray, int iSize) {
    int iCntr;
    for (iCntr = 0; iCntr < iSize; iCntr++) {
        printf("%d ", *iXArray[iCntr]);
    }
    printf("\n");
}

Мой компилятор не одобряет этот код. - [Предупреждение] передающего аргумента 1 из 'printArray' делает целое число из указателя без броска - printArray (array2, 4); - преобразованное в нижний индекс значение [Ошибки] не является ни массивом, ни указателем - printf (" %d", *iXArray[iCntr]);

Что я делаю неправильно, и почему? Как я фиксирую это?

5
задан Pieter 19 January 2010 в 13:21
поделиться

5 ответов

Попробуйте это:

void printArray(int **iXArray, int iSize) ...

В вашем примере вы предоставляете массив (int *), поэтому ссылка на него как один, вы должны сообщить компилятору ожидать массива указателей.

По умолчанию передается массив посредством ссылки. Если вы измените контент массива, он меняется на стороне Callee Aswell. Сам указатель пропускается по значению, поэтому изменение значения параметра IXARRAY ( IXARRAY = (INT **) 123; ) не изменит указатель Array2 на стороне Callee.

Если вы хотите пройти массив по значению, нужно будет обернуть его в типе значений:

typedef struct {
  int A[123];
} Array;

Array incrementArray(Array array, int count) {
    for (int i=0; i<count; i++) {
        array.A[i]++;
    }
    return array;
}
8
ответ дан 13 December 2019 в 05:35
поделиться

Относительно «остаться нетронутым». Вы проходите вещам посредством ссылки, поэтому способ удержать их от редактирования - сделать их const. У вас есть пара разных вариантов, основанных на какой части вы не хотите меняться. Однако это не позволит вам изменить их в . Как называется, вы хотите, чтобы вы не можете получить C ++, используя массивы, если вы не сделаете собственную ручную копию.

0
ответ дан 13 December 2019 в 05:35
поделиться

Это, кажется, работает, не делая Array1 редактируемой PrintArray.

/*
 * code.c
 */
#include <stdio.h>

void printArray(int *iXArray[], int iSize);

int main() {
    int array1[] = {7, 9, 3, 18};
    int *array2[] = {&array1[0], &array1[1], &array1[2], &array1[3]};

    printArray(array2, 4);

    return 0;
}

// This should print the values in array1
void printArray(int *iXArray[], int iSize) {
    int iCntr;
    for (iCntr = 0; iCntr < iSize; iCntr++) {
        printf("%d ", *iXArray[iCntr]);
    }
    printf("\n");
}
0
ответ дан 13 December 2019 в 05:35
поделиться

Вы проходите массив указателей на INT:

void printArray(int *ixArray[], int iSize)
4
ответ дан 13 December 2019 в 05:35
поделиться

Это работает также:

/*
 * code.c
 */
#include <stdio.h>

void printArray(int **iXArray, int iSize);

int main() {
    int array1[] = {7, 9, 3, 18};
    int *array2[] = {array1 + 0, array1 + 1, array1 + 2, array1 + 3};

    printArray(array2, 4);

    return 0;
}

// This should print the values in array1
void printArray(int **iXArray, int iSize) {
    int iCntr;
    for (iCntr = 0; iCntr < iSize; iCntr++) {
            printf("%d ", *iXArray[iCntr]);
    }
    printf("\n");
}

Указатель Arithmetics работает отлично работает.

0
ответ дан 13 December 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: