c++ - 为什么我在取消引用指针和不取消引用指针的情况下得到相同的值

标签 c++ pointers

以下代码:

int number = 65;
char *ptr = reinterpret_cast< char* >(&number);
cout << *ptr << endl;

*ptr 打印 Aptr 打印 A。为什么它们都打印相同的结果?

最佳答案

流正在重载 <<这样取消引用是隐式地为 char 完成的无论如何。

更具体地说:自 char *string C, ostream尝试这样读取它,即它取消引用指针并读取 char s 直到它找到一个零字节。 (这仅适用于正确的 Endianness 。)

考虑这段代码:

#include <iostream>

int main(void) {
        char c = 'A';
        int  i = 66;
        std::cout <<  c << '\n';
        std::cout << &c << '\n';
        std::cout <<  i << '\n';
        std::cout << &i << '\n';
        return 0;
}

在我的机器上(不是全部!)它打印

A
AB
66
0x7fff0d1db1bc

因为c打印正确,但是 &c被解释为字符串。但是c不是空终止的所以ostream继续阅读,找到 i 的第一个字节最后是一个空字节,因为 i 的值太小了,我们只使用它的四个字节之一。

然而,i&i按预期打印。此行为仅针对 char 实现因为它对其他类型没有意义。

关于c++ - 为什么我在取消引用指针和不取消引用指针的情况下得到相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34691721/

相关文章:

c++ - 使鼠标位置不受屏幕大小、C++ 和 Windows 的限制

c++ - 从 subversion 下载 Visual Studio 解决方案时,过滤器信息会丢失

python - python ctypes中的未知数组长度

c++ - 引用真的可以占用内存吗?

c - 为什么我在这个字符串复制程序中会出现段错误?

c++ - isDown() 与 isChecked() 的区别

c++ - 我怎样才能让 CMake 用两种不同的语言编译同一个输入文件?

c++ - 在 C++ 中使用 vector ?

c - char指针如何成为整个字符串?

c - 为什么这个指针操作不起作用?