You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何数组指针示例程序中指针的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:02:27