在 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
指向的类型的大小。
这是一个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
指向的类型的大小。