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

为什么C++中std::cout输出char变量地址时会打印字符本身?

问题原因

std::cout所属的std::ostream类对不同类型的指针重载了不同的operator<<输出逻辑:

  • 对于int*、double*这类非字符类型的指针,operator<<会直接输出指针存储的十六进制内存地址,和你最初测试int变量的结果一致。
  • 对于char*、const char*这类字符指针,operator<<有专属的重载实现,默认会将指针视为C风格字符串的首地址:从指针指向的位置开始逐字节读取字符输出,直到碰到\0(字符串结束标记)才停止输出。

你碰到的两个异常现象都和这个设计有关:

  1. 仅声明单个char b = 'x'时输出x:&b的类型是char*,触发了字符串输出逻辑,从b的地址开始第一个字符是x,如果刚好x后紧邻的内存是\0,输出就会停止,最终你只会看到字符x。
  2. 声明三个连续char变量时输出xyz:栈上分配的局部char变量通常会按声明顺序连续排布在内存中,从&b的位置开始读会依次拿到x、y、z三个字符,直到后续内存出现\0才停止,所以会输出三个拼接的字符。
    需要注意:这种读取超出变量本身内存范围的操作属于未定义行为,输出结果不固定,极端情况可能导致程序崩溃。

解决方案

如果要输出char类型变量的内存地址,只需将char*指针强转为通用指针类型void*,触发地址输出逻辑即可:

char b = 'x';
std::cout << static_cast<void*>(&b) << "\n";

上述代码就会输出你预期的十六进制内存地址。


内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:45:02