为何数组指针示例程序中指针的sizeof结果为8而非4?
数组指针
sizeof结果疑问分析 示例代码
// 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而非4,原因是什么?
解答
这是因为当前运行程序的环境是64位操作系统:
- 不管是
int*类型的普通指针p,还是int (*)[5]类型的数组指针ptr,它们本质上都是指针类型,核心作用是存储内存地址。 - 在64位系统中,地址总线宽度为64位,指针需要足够的空间来容纳完整的64位地址,因此所有指针类型的大小固定为8字节,所以
sizeof(p)和sizeof(ptr)的结果都是8。 - 如果换成32位操作系统,地址总线宽度为32位,所有指针类型的大小就会是4字节,这完全由系统的地址位数决定。
额外补充:
sizeof(*p)计算的是指针p指向的int类型变量的大小,所以结果为4字节;sizeof(*ptr)计算的是指针ptr指向的整个数组的大小,数组包含5个int元素,每个占4字节,总大小为20字节,和输出结果一致。
内容的提问来源于stack exchange,提问作者user19538954
相关产品推荐
相关产品推荐

