<p>必须将指针显式转换为 void 再传给 printf 的 %p,否则是未定义行为;std::cout 自动输出指针地址,但 char 会被当作字符串打印而非地址。</p>

C++ 怎么输出指针地址 C++ 强转void打印内存地址【指针】

printf 打印指针地址必须转成 void*

直接传 int*char* 等非 void* 指针给 printf%p 是未定义行为。C++ 标准要求 %p 只接受 void* 类型参数,否则可能崩溃、输出乱码或被编译器警告(如 GCC/Clang 的 -Wformat)。

std::cout 输出指针地址不需要手动转 void*

std::cout 对指针有专门重载:当操作数是任意对象指针(非 void*)时,它会自动以十六进制地址格式输出;但若是指向 char 的指针(char*),std::cout 会当作 C 字符串尝试打印内容,不是地址 —— 这是最大陷阱。

地址格式差异:printf 默认不带 0x 前缀,std::cout 默认带

这是实际调试时容易混淆的点。两者都输出十六进制,但前缀和对齐方式不同,不能靠肉眼比对是否相等。

跨平台安全起见,优先用 std::uintptr_t 转整数再输出

虽然 void* 足够应付大多数调试场景,但若需做算术(比如地址偏移)、存入容器或序列化,直接用指针类型仍有平台依赖风险(如某些嵌入式系统指针不是 64 位)。标准提供 std::uintptr_t —— 一个能容纳任意对象指针值的无符号整数类型。

地址本身没有“类型含义”,但输出时的类型转换、重载选择和格式控制稍有偏差,就可能看到完全不同的字符串——尤其在混合使用 printfstd::cout、或处理 char 时,最容易漏掉那一次 static_cast<void>

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。