输出指针的地址值(十六进制形式)。例如 int* p = new int(5); cout

用 cout 直接输出指针会打印什么?
直接写 cout (ptr 是普通指针,比如 int*)时,cout 会把指针当作 void* 处理,并默认以十六进制、**无前缀、无宽度控制**的方式输出地址值。结果看起来像一串数字(如 7fff5fbff6ac),但容易误读——它既不是十进制,也不带 0x 前缀,更不保证对齐。
这不是 bug,是 ostream 对 void* 的重载行为。但调试时你需要可读性:前缀、固定宽度、大写、零填充。
怎么让 cout 输出带 0x 前缀的十六进制地址?
必须显式转换为 void* 并配合流操纵符。缺一不可:
-
static_cast:避免被当成整数或字符指针误处理(尤其(ptr) char*会被当字符串输出) -
hex+showbase:启用十六进制并显示0x前缀 -
uppercase:让a-f显示为A-F,更符合常规调试习惯
完整写法:
cout << hex << showbase << uppercase << static_cast(ptr);
立即学习“C++免费学习笔记(深入)”;
注意:这些格式标志是“粘性”的,会影响后续所有 cout 输出,调试完建议恢复(见下一点)。
如何避免格式污染后续输出?
hex、showbase 等状态会持续生效,如果之后你又输出整数(比如 cout ),也会变成 0xFF,这通常不是你想要的。
安全做法是用 std::ios_base::fmtflags 临时保存并还原状态:
auto flags = cout.flags(); // 保存当前格式 cout << hex << showbase << uppercase << static_cast(ptr); cout.flags(flags); // 恢复
或者更轻量:只重置进制和前缀(不碰大小写等):
cout << hex << showbase << uppercase << static_cast(ptr); cout << dec << noshowbase; // 切回十进制、关前缀
别依赖 endl 或换行来“清状态”——它完全没用。
为什么 char* 指针直接输出是字符串而不是地址?
因为 operator 对 char* 有特化重载,语义是“输出 C 风格字符串”,不是“输出地址”。哪怕你只是想看这个指针变量自己存的地址值,也必须强转:char* s = "hello";
cout << static_cast
同理,const char*、unsigned char* 等也都受此影响。只要你想看指针本身的值,就绕不开 static_cast。
调试时最容易漏掉的就是这一转——看着输出了一堆字符串,以为地址没问题,其实根本没看到真实内存位置。











