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

时间:2015-02-16 09:13:44

标签: c arrays pointers gcc

这是一个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的大小。 为什么?

3 个答案:

答案 0 :(得分:1)

指针存储它指向的数据的地址。指针变量的大小始终为8。

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

PS:8字节大小仅适用于64位系统。它在32位中为4个字节,在16位系统中为2个字节。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

因此sizeof(*p)始终等于p指向的类型的大小。