为何最后两条cout语句的sizeof结果相同?附C++代码示例
为什么最后两条
cout的sizeof结果都是8? 嘿,这个问题的关键在于C++里数组到指针的隐式转换规则,咱们一步步拆解:
首先先明确几个基础知识点:
- 单个
char变量ch的大小是1字节,所以第一条sizeof(ch)输出1,完全符合预期。 - 像
"Hello"这种字符串字面量,它的实际类型是const char[N]——这里的N是字符串长度加1(因为要包含末尾的空终止符\0)。所以"Hello"是const char[6],sizeof它的时候会返回整个数组的总字节数,也就是6,这对应第二条输出。
现在重点看最后两条语句:sizeof("Hello"+ch)和sizeof("HelloWorld"+ch)。这里发生了一个关键的转换:
当你对数组类型(比如const char[6])执行算术运算(比如这里的+ ch)时,C++会自动把数组转换成指向数组首元素的指针,也就是const char*类型。而在当前主流的64位操作系统中,指针的大小是8字节——不管原来的字符串数组有多长,一旦转成指针后,sizeof获取的就是指针本身的大小,所以结果自然都是8。
补充个小细节:这里的ch是char类型,在参与加法运算时会被自动提升为int,但这并不改变最终的类型——因为数组已经转成指针了,指针加整数的结果依然是指针类型,所以sizeof的结果还是指针的大小。
简单总结:
- 直接对字符串字面量用
sizeof,获取的是整个字符数组的总字节数; - 当字符串字面量参与算术运算后,会隐式转成指针,此时
sizeof获取的是指针的大小(64位系统下为8)。
内容的提问来源于stack exchange,提问作者Rohan Saxena
相关产品推荐
相关产品推荐

