Почему эта декларация не работает - PullRequest
5 голосов
/ 08 сентября 2011

In int (*x)[10]; x - указатель на массив 10 int s

Так почему этот код не компилируется:

int arr[3] ;

int (*p)[3] =arr;

Но это работает:

int  arr[3];

int (*p)[3] =&arr;

Ответы [ 2 ]

10 голосов
/ 08 сентября 2011

arr - это выражение, которое оценивается как int* (это известная функция «распад массива на указатель»).

&arr - это выражение, которое оценивается как int (*)[3].

Имена массивов 'decay' для указателей на первый элемент массива во всех выражениях, кроме случаев, когда они являются операндами для операторов sizeof или &. Для этих двух операций имена массивов сохраняют свою «массивность» (C99 6.3.2.1/3 «L-значения, массивы и указатели функций»).

0 голосов
/ 08 сентября 2011

Не работает по той же причине, что и:

int i;
int* pi = i; // error: no conversion from int to int*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...