Указатель на массив как параметр функции - PullRequest
6 голосов
/ 17 марта 2012

Я написал функцию, которая берет указатель на массив для инициализации его значений:

#define FIXED_SIZE 256
int Foo(int *pArray[FIXED_SIZE])
{
/*...*/
}

//Call:

int array[FIXED_SIZE];
Foo(&array);

И он не компилируется:

Ошибка C2664:«Foo»: невозможно преобразовать параметр 1 из «int (* __w64) [256]» в «int * []»

Однако я взломал это вместе:

typedef int FixedArray[FIXED_SIZE];
int Foo(FixedArray *pArray)
{
/*...*/
}

//Call:

FixedArray array;
Foo(&array);

И это работает.Чего мне не хватает в первом определении?Я думал, что эти два будут эквивалентны ...

Ответы [ 3 ]

14 голосов
/ 17 марта 2012
int Foo(int *pArray[FIXED_SIZE])
{
/*...*/
}

В первом случае pArray - это массив указателей, а не указатель на массив .

Вам нужны скобки, чтобы использовать указатель на массив:

int Foo(int (*pArray)[FIXED_SIZE])

Вы получаете это бесплатно с typedef (поскольку это уже тип, * имеет другое значение). Иными словами, typedef имеет свои собственные скобки.

Примечание: опыт показывает, что в 99% случаев, когда кто-то использует указатель на массив, он может и должен просто использовать указатель на первый элемент .

2 голосов
/ 07 августа 2013

Одна простая вещь состоит в том, чтобы запомнить правило по часовой стрелке, которое можно найти в http://c -faq.com / Децл / spiral.anderson.html

Это оценило бы первый, который будет массивом указателей. Второй - указатель на массив фиксированного размера.

0 голосов
/ 17 марта 2012

Массив распадается на указатель.Итак, это работает во втором случае.В первом случае параметр функции представляет собой массив указателей, но не указатель на целое число, указывающее на первый элемент в последовательности.

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