gpt4 book ai didi

c++ - 为什么 cout << &r 给出的输出与 cout << (void*)&r 不同?

转载 作者:行者123 更新时间:2023-11-30 00:51:39 25 4
gpt4 key购买 nike

这可能是一个愚蠢的问题,但我是 C++ 的新手,所以我仍然在研究基础知识。测试指针,我遇到了一些没有产生我预期的输出的东西。

当我运行以下命令时:

char r ('m');
cout << r << endl;
cout << &r << endl;
cout << (void*)&r << endl;

我期望这样:

m
0042FC0F
0042FC0F

..但我明白了:

m
m╠╠╠╠ôNh│hⁿB
0042FC0F

我在想也许因为 rchar 类型,cout 会将 &r 解释为 char* 和 [出于某种原因] 输出指针值 - 包含 r 地址的字节 - 作为一系列 chars,但是为什么第一个是m,指向的地址的内容,而不是指针地址第一个字节的char表示.. 就好像 cout&r 解释为 r 但它不只是输出 'm',而是on 以输出更多字符 - 从后续 11 个内存地址的字节值解释。为什么?为什么是 11?

我在 64 位 Win7 上使用 MSVC++ (Visual Studio 2013)。


后记:我在这里得到了很多正确答案(正如预期的那样,考虑到问题的微不足道的性质)。由于我只能接受一个,所以我把它作为我第一个看到的。但是,谢谢大家。

所以总结和扩展我的问题中提到的本能理论:

是的,cout 确实将 &r 解释为 char*,但是因为 char* 是一个“特殊的东西” ' 在 C++ 中,这本质上意味着 一个空终止字符串(而不是 一个指针 [指向单个 char]),cout 将尝试通过输出字符(从 r 的内存地址的字节内容开始解释)来打印出该字符串,直到它遇到 '\0'。这解释了 11 个额外的字符(巧合的是多了 11 个字节才能达到 NUL)。

为了完整性 - 相同的代码,但使用 int 而不是 char,按预期执行:

int s (3);
cout << s << endl;
cout << &s << endl;
cout << (void*)&s << endl;

产生:

3
002AF940
002AF940

最佳答案

A char *C++是一件特别的事, 继承自 C .在大多数情况下,它是一个 C风格的字符串。它应该指向 char 的数组。 s,以 0 结尾(一个 NUL 字符,'\0')。

所以它尝试打印这个,在'm'之后进入内存, 寻找终止 '\0' .这使得它打印一些随机垃圾。这被称为 Undefined Behaviour .

关于c++ - 为什么 cout << &r 给出的输出与 cout << (void*)&r 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20958550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com