// pointer of array
#include<stdio.h>
int main()
{
int arr[] = { 3, 5, 6, 7, 9 };
int *p = arr;
int (*ptr)[5] = &arr;
printf("p = %p, ptr = %p\n", p, ptr);
printf("*p = %d, *ptr = %p\n", *p, *ptr);
printf("sizeof(p) = %lu, sizeof(*p) = %lu\n",
sizeof(p), sizeof(*p));
printf("sizeof(ptr) = %lu, sizeof(*ptr) = %lu\n",
sizeof(ptr), sizeof(*ptr));
return 0;
}
Выход
p = 0x7ffde1ee5010, ptr = 0x7ffde1ee5010
*p = 3, *ptr = 0x7ffde1ee5010
sizeof(p) = 8, sizeof(*p) = 4
sizeof(ptr) = 8, sizeof(*ptr) = 20
Вот почему sizeof(p)
или sizeof(ptr)
равно 8?
Этот код является примером указателя на массив
Почему 8, а почему не 4?
@Someprogrammerdude, тогда почему *ptr = 20
Потому что ptr
указывает на массив из пяти 4-байтовых int
элементов. Это означает, что *ptr
— это сам массив размером 5 * sizeof(int)
(то есть 5 * 4
) байт. ptr
— указатель, *ptr
— объект, на который указывает ptr
.
В 64-битной системе, которой, очевидно, является ваша, указатели представлены 8 байтами, независимо от того, на что они указывают.
В вашем примере и p
, и ptr
являются указателями. В случае p
у нас есть указатель на первый int
в массиве. Очевидно, в вашей системе int
занимает 4 байта. В случае ptr
он был объявлен как указатель на массив из 5 значений int
, что составляет 20 байт.
Пожалуйста, помните, что и
p
, иptr
являются указателями. А в 64-битных системах указатели обычно имеют размер 8 байт (64 бита).