You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何打印指针地址?cout输出指针为何显示字符串?

嘿,这个问题其实是C++标准库中cout的重载行为导致的,很多刚学指针的同学都会遇到,我来给你详细解释下:

为什么cout << names[0]输出字符串而非地址?

C++的std::ostream(也就是cout所属的类)对<<运算符做了针对性的重载:当你传入**const char*类型的指针时,它会默认把这个指针看作C风格字符串的起始地址**,然后从该地址开始逐个输出字符,直到碰到字符串结束符\0为止。

你定义的char *names[]={"abc", "def", ...}里,每个数组元素都是指向对应字符串字面量首字符的char*指针,所以names[0]的类型正好匹配这个重载,因此cout就直接输出了整个字符串"abc",而不是指针的内存地址。

如何正确打印指针的地址?

这里有几种可靠的方法:

方法一:强制转换为void*(推荐)

cout对void*类型的重载逻辑是输出指针的内存地址,所以只需要把char*强制转换为void*即可:

#include <iostream>
using namespace std;

int main() { 
    char *names[]={"abc", "def", "ghi", "jkl", "mno"}; 
    cout << static_cast<void*>(names[0]) << endl; 
    return 0; 
}

这是最符合C++标准的做法,兼容性最好。

方法二:使用C语言的printf

如果你熟悉C语言的格式化输出,printf的%p格式符专门用于打印指针地址,同样需要把指针转换为void*:

#include <iostream>
#include <cstdio>
using namespace std;

int main() { 
    char *names[]={"abc", "def", "ghi", "jkl", "mno"}; 
    printf("%p\n", static_cast<void*>(names[0])); 
    return 0; 
}

方法三:转换为整数类型输出(进阶)

你可以把指针转换成uintptr_t(一种能容纳指针值的无符号整数类型,需要包含头文件<cstdint>),然后以十六进制形式输出:

#include <iostream>
#include <cstdint>
#include <iomanip>
using namespace std;

int main() { 
    char *names[]={"abc", "def", "ghi", "jkl", "mno"}; 
    cout << "0x" << hex << static_cast<uintptr_t>(names[0]) << endl; 
    return 0; 
}

这种方式适合你需要以整数形式查看地址的场景,hex用于指定输出十六进制,手动添加0x是为了让地址格式更直观。

内容的提问来源于stack exchange,提问作者Abhinav Dhawan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:57:42