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

C++字符地址输出异常:为何地址被识别为ASCII码而非十六进制?

问题解答:为什么cout把字符地址当成ASCII输出?

这个问题其实是C++中std::cout对不同指针类型的重载行为导致的——你踩了一个很常见的新手坑!

问题根源

当你用cout输出&c时,&c的类型是char*(因为c是char变量,取地址后得到指向char的指针)。而std::ostream对char*类型有专门的重载逻辑:它会把这个指针当作C风格字符串的起始地址,从该地址开始逐字符输出,直到遇到\0(空字符)才停止。

你的代码里c的值是'A',但c所在内存的下一个字节是未定义的随机值(比如刚好是0x30,对应ASCII字符'0',再往后可能是空格),所以cout会先输出'A',接着打印后续内存里的随机字符,直到碰到某个\0,这就是你看到&c = A0 的原因。

解决方案

要让cout输出指针的十六进制地址,你需要把char*强制转换为void*类型。因为std::ostream对void*的重载是专门用来输出内存地址的,会以标准十六进制格式打印。

修改后的代码示例:

#include <iostream>
using namespace std;
int main () {
    char c;
    c = 'A';
    // 使用static_cast进行类型转换,更符合C++风格
    cout<<"c = "<<c<<" &c = "<<static_cast<void*>(&c)<<endl;
    // 也可以用C风格强制转换:(void*)&c,效果完全相同
    return 0;
}

运行这段代码后,就能得到你期望的十六进制格式的内存地址输出了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:05:39