C++ 怎么输出指针地址 C++ cout打印内存地址格式说明【调试】

6次阅读

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

C++ 怎么输出指针地址 C++ cout打印内存地址格式说明【调试】

cout 直接输出指针会打印什么?

直接写 cout (ptr 是普通指针,比如 int*)时,cout 会把指针当作 void* 处理,并默认以十六进制、**无前缀、无宽度控制**的方式输出地址值。结果看起来像一串数字(如 7fff5fbff6ac),但容易误读——它既不是十进制,也不带 0x 前缀,更不保证对齐。

这不是 bug,是 ostreamvoid* 的重载行为。但调试时你需要可读性:前缀、固定宽度、大写、零填充。

怎么让 cout 输出带 0x 前缀的十六进制地址?

必须显式转换为 void* 并配合流操纵符。缺一不可:

  • static_cast(ptr):避免被当成整数或字符指针误处理(尤其 char* 会被当字符串输出)
  • hex + showbase:启用十六进制并显示 0x 前缀
  • uppercase:让 a-f 显示为 A-F,更符合常规调试习惯

完整写法:

cout << hex << showbase << uppercase << static_cast(ptr);

立即学习C++免费学习笔记(深入)”;

注意:这些格式标志是“粘性”的,会影响后续所有 cout 输出,调试完建议恢复(见下一点)。

如何避免格式污染后续输出?

hexshowbase 等状态会持续生效,如果之后你又输出整数(比如 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(s); // 正确:输出地址 cout << s;                      // 错误(调试意图下):输出 "hello"

同理,const char*unsigned char* 等也都受此影响。只要你想看指针本身的值,就绕不开 static_cast

调试时最容易漏掉的就是这一转——看着输出了一堆字符串,以为地址没问题,其实根本没看到真实内存位置。

text=ZqhQzanResources