Что создаст int (*ptr)[30];
? В общем, что произойдет, если в скобках указано имя переменной (в данном случае указатель)?Что будет Декларация int (* ptr) [30]; Создайте?
ответ
На этот вопрос всегда можно ответить, посмотрев выражение наизнанку, с рассмотренным приоритетом.
в вашем случае:
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
тот же трюк всегда может быть применен к любому выражению об объявлении переменной (обратите внимание, что объявление функции является особенным, но оно все еще может быть проанализировано в таким образом, до точки.)
int (*ptr)[30];
Здесь PTR представляет собой указатель на массив типа int
с 30 элементами.
Так без скобок
int *ptr[30];
создаст массив ptr
который содержит 30 целочисленных указателей.
Как объясняется другим ответом, это указатель на массив из 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 *
они оценивают по тем же адресам.
Это несколько эзотерический; вы бы использовали указатель на первый элемент массива вместо указателя на массив в большинстве случаев.
В этом случае 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.
- 1. Что означает это объявление: «int (* ptr [3])();»?
- 2. int * ptr = (int *) (& a + 1);
- 3. Что означает (*) in (int (*) [30])?
- 4. C99: Что означает «int const * ptr»?
- 5. Вперед декларация просто не будет
- 6. Семантика int (* ptr)() ;?
- 7. C - (ptr = = & ptr) Что такое * ptr?
- 8. значение * ((INT *) PTR + 1)
- 9. подталкивания Scoped Ptr - Декларация против распределения
- 10. Это будет действительная декларация?
- 11. Инкрементный указатель (ptr ++) и (* ptr ++)
- 12. C++ разыменования указателя ничтожной, преобразование INT PTR к аннулированию PTR
- 13. Что PTR sub_xxxxx значит
- 14. Что означает `dword ptr`?
- 15. Почему int ** ptr указывает на тот же адрес, что и int arr [3] [3] при доступе к ptr [i] [j]?
- 16. разница между PTR, * PTR и & PTR
- 17. Создайте двойной указатель (ptr to ptr) в std :: pair with boost
- 18. Создайте pcl :: PointCloud :: Ptr из pcl :: PointCloud
- 19. Почему {typedef int * PTR; const PTR p = #} не эквивалентен «const int * p = & num», а «int * const p = & num»?
- 20. Как объединить str и int ptr
- 21. Использование массива ptr-to-ptr?
- 22. динамический 2d массив: int (* ptr) [4] = новый int [7] [4];
- 23. Array, * ptr или ** ptr C++
- 24. Что означает cmp DWORD PTR и mov DWORD PTR?
- 25. Что значит писать `static void * ptr = & ptr` в Objective-C
- 26. что смысл ** PTR в с
- 27. Что делает "(void)! Ptr" do?
- 28. компилятор говорит, что декларация отсутствует;
- 29. разница между PTR и & PTR
- 30. Что такое форвардная декларация
Очень полезно для вопросов такого характера: http://cdecl.org/.'int (* p) [10]' -> * объявлять p как указатель на массив 10 из int * –