我运行以下代码:
#include <iostream>
using namespace std;
typedef struct Test
{
char a;
char b;
int i;
double d;
}Test;
int main()
{
Test test;
test.a = 'a';
test.b = 'b';
test.i = 478;
test.d = 4.7;
cout << &test.a << '\n'
<< &test.b << '\n'
<< &test.i << '\n'
<< &test.d << '\n';
return 0;
}
输出是:
ab@
b@
0x28fe94
0x28fe98
起初,我认为这是&
和之间的优先级的结果。
。
但是0x28fe94
和0x28fe94
说明不是优先级的问题。
我能弄清楚 ab@
和 b@
是什么意思?
最佳答案
当你写作时
cout << &test.a
因为test.a
是 char
, 这将调用 operator<< (ostream&, const char*)
重载,认为你的 char*
是指向 C 风格字符串的指针,而不是仅指向一个字符的指针。因此,该操作将从 &test.a
的内存地址开始读取字节。直到它找到一个空终止符(一个零字节)。这恰好打印出 ab@
, 自 a
具有值(value) 'a'
, b
具有值(value) 'b'
,而您系统上的数字 478 恰好对应于 @
。字符后跟一个空字节。
如果您想查看test.a
的数字地址和 test.b
, 将指针指向 void*
s,它将选择 operator<< (ostream&, const void*)
重载。例如:
cout << static_cast<void*>(&test.a)
希望这对您有所帮助!
关于c++ - 为什么这些变量的地址打印为 ab@ 和 b@?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20942018/