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
相关产品推荐
相关产品推荐

