为何sizeof运算符计算数组与数组首元素的字节数结果存在差异?
你看到的运行结果完全符合C/C++的语言标准,核心误区是默认数组名在所有场景下都会等价为指向首元素的指针,没搞懂指针退化的规则边界
数组名隐式退化为首元素指针是有明确例外的,具体拆解:
- 你打印时发现
array和&array[0]输出的地址完全一致,是因为把数组名作为std::cout的输出参数传入时,数组名触发了隐式转换,自动变成了指向数组首元素的int*指针,这时候它确实和&array[0]没有任何区别。 - 但
sizeof是典型的数组名退化例外场景:当sizeof的操作数是数组名本身时,根本不会触发指针退化,它计算的是整个数组在内存中占用的总字节数。你定义的是存储了3个int的数组,常规桌面平台下单个int占4字节,总大小就是3*4=12字节,和你得到的b=12的结果完全匹配。 - 而
sizeof(array[0])的结果是4也很好理解:array[0]就是数组里存的第一个int变量,sizeof计算它的大小自然就是单个int的长度,也就是4字节。
常见混淆提示
千万别觉得地址值相同就代表两边是完全等价的东西:
- 退化为
int*的array是指向单个int的指针,指针每偏移一步的长度是4字节 - 作为sizeof操作数的
array类型是长度为3的int数组,本质不是指针,所以计算的是这块连续内存的总大小,不是指针本身的长度
除了sizeof之外,数组名不会发生退化的场景还有两类:对数组名使用取地址符&(得到的是指向整个数组的指针,类型为int(*)[3],和普通的int指针步长、类型都不一样)、用数组名初始化数组引用的场景。
内容的提问来源于stack exchange,提问作者Renz Carillo
相关产品推荐
相关产品推荐

