在 gcc 4.2.1 上,指向二维数组的指针大小为 8 的原因是什么?

What is the reason for size of a pointer to a 2d array being 8 on gcc 4.2.1?

这是一个c程序

#include<stdio.h>
main()
{
 int(*p)[3][4];
 printf("size of p= %d",sizeof(p));
 printf("size of *p= %d",sizeof(*p));
 return 0;
}

我可以理解 (*p) 的大小应该是数组的总大小,即在这种情况下为 48 字节。 但是 gcc 版本 4.2.1 给出了 p = 8 的大小。 为什么?

当您说声明是 int(*p)[3][4] 时, 您实际上是指将 p 声明为指向 int 类型的数组 4 的数组 3 的指针。这里 p 是一个指针,在你的 64 位机器上指针的大小是 8

理想情况下 sizeof(p) == 8 & sizeof(*p) == 48

指针存储它指向的数据的地址。指针变量的大小总是8.

sizeof(*p) = 48
sizeof(p) = sizeof(&(*p)) = 8

PS : 8 字节大小仅在 64 位系统中。在32位系统中是4个字节,在16位系统中是2个字节。

因为指针的值是一个地址,所以它的值不等于它指向的值。否则指针将不是指针,它们只是常规变量,因此无用。

如果您使用的是 64 位机器,指针的大小将始终为 8 个字节。

编辑:如果您想知道为什么 sizeof(*p)8,那是因为 *p 求值为元素数组中的第一个(除非您递增)元素指向。所以 *p = p[0], *(p+n) = p[n], 等等

所以 sizeof(*p) 总是等于 p 指向的类型的大小。