2015-03-25 3 views
3

Что создаст int (*ptr)[30];? В общем, что произойдет, если в скобках указано имя переменной (в данном случае указатель)?Что будет Декларация int (* ptr) [30]; Создайте?

+7

Очень полезно для вопросов такого характера: http://cdecl.org/.'int (* p) [10]' -> * объявлять p как указатель на массив 10 из int * –

ответ

4

На этот вопрос всегда можно ответить, посмотрев выражение наизнанку, с рассмотренным приоритетом.

в вашем случае:

int (*ptr)[30]; 

можно рассматривать как

int (*ptr)[30]; 
-> ptr     a variable called ptr 
--> *ptr    which is a pointer 
---> (*ptr)[30]  which points to an array with length of 30 
----> int (*ptr)[30] in which each element is of type int 

если круглые скобки опущены, история становится:

int *ptr[30]; 
-> ptr     a variable called ptr 
--> ptr[30]   which is an array with length of 30 
---> *ptr[30]   in which each element is a pointer 
----> int *ptr[30]  and each individual points to an int 

тот же трюк всегда может быть применен к любому выражению об объявлении переменной (обратите внимание, что объявление функции является особенным, но оно все еще может быть проанализировано в таким образом, до точки.)

4
int (*ptr)[30]; 

Здесь PTR представляет собой указатель на массив типа int с 30 элементами.

Так без скобок

int *ptr[30]; 

создаст массив ptr который содержит 30 целочисленных указателей.

2

Как объясняется другим ответом, это указатель на массив из 30 целых чисел.

Как вы на самом деле использовать эти виды деклараций:

int arr[30]; 
int (*ptr)[30] = &arr; 
(*ptr)[0] = 5; 
printf("%d\n", arr[0]); 

Таким образом, это указатель на массив из 30 элементов, а не указатель на первый элемент массива, хотя их адреса памяти одинаковы (см. casting pointer to array into pointer).

Отметьте, что &arr имеет тип, отличный от arr, хотя при его литье в void * они оценивают по тем же адресам.

Это несколько эзотерический; вы бы использовали указатель на первый элемент массива вместо указателя на массив в большинстве случаев.

1

В этом случае ptr является указателем на 30-элементный массив int.

Постфиксные операторы, такие как [] имеют более высокий приоритет, чем унарные операторы, такие как *, так что выражение *a[i] будет разобрано как *(a[i]) (a представляет собой массив указателей). Чтобы использовать указатель для массива, вы должны явно сгруппировать унарный оператор * с именем массива, например (*a)[i] (a - указатель на массив).

Handy стол:

*a[N]   -- a is an N-element array of pointer 
(*a)[N]   -- a is a pointer to an N-element array 
    *f()   -- f is a function returning a pointer 
(*f)()   -- f is a pointer to a function. 
Смежные вопросы