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

C++中数组使用sizeof运算符为何不返回指针大小

为什么sizeof(arr)没有返回指针的占用大小

核心误区在于很多人默认「数组名完全等价于指针」,这个认知是错的。

你定义的arr原生类型是长度为5的整型数组,也就是int[5],本身不是指针类型。C/C++里确实有数组到指针的隐式衰变规则:绝大多数表达式场景下,数组名会自动转成指向数组首元素(基地址)的指针,但这个衰变不是无条件触发的,sizeof的运算对象就是明确列在语言标准里的不触发衰变的场景。

对应的测试代码如下:

int arr[5] = {1,2,3,4,5};
cout<<sizeof(arr);

这里sizeof直接作用在数组名本身,没有触发指针衰变,运算符能拿到完整的数组类型信息,计算的是整个数组占用的连续内存总大小:数组共包含5个int元素,单个int占4字节,总大小就是5*4=20字节,和实际运行结果完全匹配。

只有当数组名已经发生了隐式或显式的指针转换后,再做sizeof运算,得到的才是指针本身的占用大小(32位系统下为4字节,64位系统下为8字节),比如:

int* p = arr; // 这里arr触发隐式衰变,转成首元素指针赋值给p
cout << sizeof(p); // 输出指针的占用大小,和数组长度没有任何关系

除了sizeof场景外,还有两个常见的不触发数组衰变的场景:

  • 对数组名取地址(写&arr)时,拿到的是指向整个数组的指针,类型是int(*)[5],不是指向单个int的首元素指针
  • 用数组初始化数组类型的引用时,也不会发生指针衰变

内容的提问来源于stack exchange,提问作者Abhishek Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:45:39