为什么C++中cout输出char*指针与char值时会显示笑脸符号?
问题原因分析
cout对char*类型的特殊重载行为
C++标准库中的
std::ostream(cout的类型)对char*类型做了专门的运算符重载,默认会把传入的char*当做C风格字符串的首地址处理,而非像其他类型指针一样直接输出内存地址:它会从传入的地址开始逐个读取字节,直到遇到值为\0(ASCII 0)的终止符为止,把沿途读取到的每个字节作为ASCII字符输出。
你代码里的int a = 1025对应的十六进制值为0x401,在小端模式(绝大多数x86/x64设备默认的存储规则)下,4字节int的内存排布从低地址到高地址依次为0x01、0x04、0x00、0x00。你把int*强转成char*赋值给p0后,p0指向的就是第一个字节0x01的地址,此时cout << p0就会依次输出0x01对应的字符☺、0x04对应的字符♦,直到遇到第三个字节0x00停止,所以你会看到Address=后显示的是☺♦而非内存地址。
char类型输出默认显示ASCII字符*p0的类型是char,值为0x01,cout输出char类型值时默认会输出其对应的ASCII字符,而非整数值。ASCII编码中0x01对应的控制字符在Windows控制台等环境下的渲染结果就是笑脸符号☺,所以你会看到Value=后也输出了笑脸。
正确输出的修改方案
如果要正常输出char*对应的内存地址、以及char对应的整数值,需要做强制类型转换:
// 把char*转成void*让cout输出地址,把char转成int让cout输出数字 cout << "Address= " << static_cast<void*>(p0) << " Value= " << static_cast<int>(*p0) << endl;
修改后输出就会符合预期:
Size of integer is: 4 bytes Address= 0x61ff04 Value= 1025 Size of char is: 1 bytes Address= 0x61ff04 Value= 1 It printed smilie above
内容的提问来源于stack exchange,提问作者prajwal sajji
相关产品推荐
相关产品推荐

