【发布时间】:2014-01-06 20:20:10
【问题描述】:
这可能是一个愚蠢的问题,但我是 C++ 新手,所以我仍然在玩弄基础知识。测试指针,我碰到了一些没有产生我预期的输出的东西。
当我运行以下内容时:
char r ('m');
cout << r << endl;
cout << &r << endl;
cout << (void*)&r << endl;
我预料到了:
m
0042FC0F
0042FC0F
..但我明白了:
m
m╠╠╠╠ôNh│hⁿB
0042FC0F
我在想也许因为r 是char 类型,cout 会将&r 解释为char* 并且[出于某种原因] 输出指针值 - 包含@ 地址的字节987654329@ - 作为一系列chars,但是为什么第一个会是m,指向的地址的内容,而不是第一个字节的char表示指针地址.. 就好像cout 将&r 解释为r 但不仅仅是输出'm',而是继续输出更多字符——从后续11 个内存地址的字节值解释。 。 为什么?为什么是 11?
我在 64 位 Win7 上使用 MSVC++ (Visual Studio 2013)。
后记:我在这里得到了很多正确的答案(正如预期的那样,考虑到问题的琐碎性)。由于我只能接受一个,所以我把它作为我看到的第一个。不过谢谢大家。
所以总结和扩展我的问题中提到的本能理论:
是的,cout 确实将&r 解释为char*,但由于char* 在C++ 中是一个“特殊事物”,它本质上意味着一个空终止字符串(而不是一个指针 [指向单个char]),cout 将尝试通过输出字符(从r 的内存地址的字节内容解释)来打印该字符串,直到遇到@ 987654344@。这解释了额外的 11 个字符(巧合的是,它又多花了 11 个字节来达到NUL)。
为了完整性 - 相同的代码,但使用 int 而不是 char,按预期执行:
int s (3);
cout << s << endl;
cout << &s << endl;
cout << (void*)&s << endl;
生产:
3
002AF940
002AF940
【问题讨论】:
-
char* 被解释为字符串。
标签: c++ visual-c++ pointers char cout