C++字符地址输出异常:为何地址被识别为ASCII码而非十六进制?
问题解答:为什么cout把字符地址当成ASCII输出?
这个问题其实是C++中std::cout对不同指针类型的重载行为导致的——你踩了一个很常见的新手坑!
问题根源
当你用cout输出&c时,&c的类型是char*(因为c是char变量,取地址后得到指向char的指针)。而std::ostream对char*类型有专门的重载逻辑:它会把这个指针当作C风格字符串的起始地址,从该地址开始逐字符输出,直到遇到\0(空字符)才停止。
你的代码里c的值是'A',但c所在内存的下一个字节是未定义的随机值(比如刚好是0x30,对应ASCII字符'0',再往后可能是空格),所以cout会先输出'A',接着打印后续内存里的随机字符,直到碰到某个\0,这就是你看到&c = A0 的原因。
解决方案
要让cout输出指针的十六进制地址,你需要把char*强制转换为void*类型。因为std::ostream对void*的重载是专门用来输出内存地址的,会以标准十六进制格式打印。
修改后的代码示例:
#include <iostream> using namespace std; int main () { char c; c = 'A'; // 使用static_cast进行类型转换,更符合C++风格 cout<<"c = "<<c<<" &c = "<<static_cast<void*>(&c)<<endl; // 也可以用C风格强制转换:(void*)&c,效果完全相同 return 0; }
运行这段代码后,就能得到你期望的十六进制格式的内存地址输出了。
内容的提问来源于stack exchange,提问作者Embedded_Dude
相关产品推荐
相关产品推荐

