为什么 char 类型变量的打印引用会返回其中的值?

Ars*_*nic 1 c++ reference

代码片段:

#include <iostream>

int main()
{
    char c = 50;
    int i = 50;

    std::cout<<&c<<"\n";
    std::cout<<*(&c)<<"\n";
    std::cout<<&i<<"\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

预期输出:

<memory_address>
2
<memory_address>
Run Code Online (Sandbox Code Playgroud)

原始输出:

2
2
0x7ffee0504ac4
Run Code Online (Sandbox Code Playgroud)

困惑 :

我认为&在这种情况下应该返回变量的引用,打印哪个(根据我的说法)应该给我一个内存地址,这对于其他数据类型的变量来说是正确的intfloat并且double

那么为什么在 type 的情况下char,它会显示其中的值呢?


编译器 = clang-1103.0.32.62

StP*_*ere 5

这是因为operator<< (const char*)ostream的过载。

&c是类型char*并且operator<<尝试打印以 0 结尾的 C 字符串。如果您强制转换为 void* as(void *)(&c)那么您将按预期获得内存地址:

#include <iostream>

int main()
{
    char c = 50;
    int i = 50;

    std::cout<<&c<<"\n";   // this will try to print null-terminated char* string.
    std::cout << (void*)(&c) << "\n"; // this will print memory address as expected
    std::cout<<*(&c)<<"\n";
    std::cout<<&i<<"\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意:cout << &c可能会打印更多字符,具体取决于内存地址后面&c的字节(0 字节可能远远落后)。所以这基本上是未定义的行为(UB)。