首页 > 解决方案 > 为什么打印 char 类型变量的引用会返回其中的值?

问题描述

代码片段:

#include <iostream>

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

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

    return 0;
}

预期输出:

<memory_address>
2
<memory_address>

原始输出:

2
2
0x7ffee0504ac4

困惑 :

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

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


编译器 = clang-1103.0.32.62

标签: c++reference

解决方案


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

&c是类型char*,并operator<<尝试打印以 0 结尾的 C 字符串。如果您转换为 void* ,(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;
}

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


推荐阅读