代码片段:
#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
、float
和double
,都是正确的。
那么,为什么在char
类型的情况下,它会显示其中的值?
编译器= clang-1103.0.32.62
发布于 2021-01-03 00:49:54
这是因为of的operator<< (const char*)
过载。
&c
的类型为char*
,operator<<
试图打印0结尾的C-字符串.如果您将空*转换为(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)。
发布于 2021-01-03 00:52:19
代码中没有引用。&
是address-of操作符,它返回指针而不是引用。&
仅在声明中使用引用,而不是在表达式中使用引用。
&c
和&i
得到不同结果的原因是operator<<
对char*
有重载,假定参数是C字符串。因为这不是你的情况,你的程序实际上有未定义的行为。
https://stackoverflow.com/questions/65548016
复制相似问题