#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)
我认为&在这种情况下应该返回变量的引用,打印哪个(根据我的说法)应该给我一个内存地址,这对于其他数据类型的变量来说是正确的int,float并且double
那么为什么在 type 的情况下char,它会显示其中的值呢?
编译器 = clang-1103.0.32.62
这是因为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)。