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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:15:05