C++中sizeof()函数参数本质相近却输出不同结果的原因探究
为什么数组相关表达式传入sizeof()会得到不同结果?
先看你的代码(已翻译为中文注释):
#include <iostream> using namespace std; int main( ) { int b[3][2]; cout<<sizeof(b)<<endl; cout<<sizeof(b+0)<<endl; cout<<sizeof(*(b+0))<<endl; // 下一行输出类似 0012FF68 的地址 cout<<"b的地址: "<<b<<endl; cout<<"b+1的地址: "<<b+1<<endl; cout<<"&b的地址: "<<&b<<endl; cout<<"&b+1的地址: "<<&b+1<<endl<<endl; return 0; }
问题的核心是:sizeof的结果由传入表达式的静态类型决定,和地址值是否相同无关。下面逐个拆解每个sizeof的计算逻辑:
sizeof(b)
b的类型是int[3][2](3行2列的二维int数组),sizeof直接计算整个数组的总字节数。假设int占4字节,总大小就是3*2*4=24字节。sizeof(b+0)
数组名b在表达式b+0中会触发数组到指针的隐式转换(只有sizeof、&、decltype等少数场景不会转换)。转换后,b变成指向数组首元素的指针——这里二维数组的首元素是一个int[2]类型的一维数组,所以指针类型是int(*)[2](指向一维int数组的指针)。指针的大小由系统位数决定:32位系统是4字节,64位是8字节,所以这里输出4或8。sizeof(*(b+0))b+0是指向首元素一维数组的指针,解引用后得到这个一维数组本身(类型int[2])。sizeof计算这个一维数组的字节数,即2*4=8字节。
再补充下地址打印的差异:b 和 &b 打印的地址值完全相同,但它们的类型天差地别:
b转换后的指针类型是int(*)[2],所以b+1会跳过一个一维数组的大小(8字节),地址值增加8;&b的类型是int(*)[3][2](指向整个二维数组的指针),所以&b+1会跳过整个二维数组的大小(24字节),地址值增加24。
本质上,数组名、数组指针这些概念虽然地址值可能重叠,但类型不同,sizeof和指针算术都会严格按照类型来计算。
内容的提问来源于stack exchange,提问作者Aeron Akash
相关产品推荐
相关产品推荐

