电话
400 9058 355
输出指针的地址值(十六进制形式)。例如 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);
注意:这些格式标志是“粘性”的,会影响后续所有 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。
调试时最容易漏掉的就是这一转——看着输出了一堆字符串,以为地址没问题,其实根本没看到真实内存位置。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...