C++中配合指针使用cout时输出结果不符合预期问题咨询
异常输出原因说明
所有cout输出不符合预期的核心原因是:std::cout对char*/const char*类型有特殊的重载规则——默认将这类参数视为以\0结尾的C风格字符串处理,而非像其他类型指针一样直接输出内存地址。
第二段代码问题解析
你给出的第二段代码如下:
#include<iostream> using namespace std; int main() { char v = 65; cout << &v << endl; // output: A╠╠╠╠▀?╞«4°O }
- 变量
v是char类型,&v的类型是char*,触发cout的字符串重载逻辑。 cout会从v对应的内存地址开始逐个读取字节,直到碰到\0(值为0的字节)才停止输出。第一个字节是v的值65,对应字符A,后续读取的是v之后的随机内存内容,所以会输出一堆乱码。- 如果要正确输出
char类型变量的地址,需要将其强转为void*类型:cout << static_cast<void*>(&v) << endl;
第一段代码问题解析
你给出的第一段代码使用了C风格强制类型转换,绕过了编译器类型检查,属于违反类型别名规则的未定义行为,我们基于你观测到的输出解释逻辑:
#include<iostream> using namespace std; int main() { int v = 65; int* q = &v; char** o = (char**)&q; cout << o << endl; // output: 012FFCAC cout << *o << endl; // output: A cout << **o << endl; // output: A printf("%c",*o); // cause an error printf("%p",*o); // works and the output=&v }
逐行解释输出:
cout << o << endl;:o的类型是char**,不属于char*/const char*,cout按普通指针处理,正常输出o本身的内存地址,结果符合预期。cout << *o << endl;:*o的类型是char*,触发字符串重载。*o的值就是指针q的内容,也就是v的地址,从该地址读取的第一个字节是v的值65对应字符A,所以输出A。cout << **o << endl;:**o的类型是char,值为65,直接输出字符A,结果符合预期。printf("%c",*o);报错:%c格式符要求传入字符对应的整型值,你传入的*o是指针类型,参数类型不匹配触发未定义行为,所以运行报错。printf("%p",*o);正常输出:%p格式符用于输出指针本身的值,*o的值就是q的内容也就是v的地址,所以输出结果符合预期。
内容的提问来源于stack exchange,提问作者Fady Hany
相关产品推荐
相关产品推荐

