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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:45:33