Правильно передать массив, содержащий указатели на функцию - PullRequest
4 голосов
/ 19 января 2010

Код:

/*
 * 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 ]

7 голосов
/ 19 января 2010

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

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

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

По умолчанию передача массива осуществляется по ссылке. Если вы измените содержимое массива, он также изменится на стороне вызываемого. Сам указатель передается по значению, поэтому изменение значения параметра iXArray (iXArray = (int**)123;) не изменит указатель array2 на стороне вызываемого.

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

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

Array incrementArray(Array array, int count) {
    for (int i=0; i<count; i++) {
        array.A[i]++;
    }
    return array;
}
3 голосов
/ 19 января 2010

Вы передаете массив указателей в int:

void printArray(int *ixArray[], int iSize)
0 голосов
/ 19 января 2010

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

/*
 * 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 голосов
/ 19 января 2010

Похоже, что это работает, не делая 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 голосов
/ 19 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...