为什么这些变量的地址打印为ab @和b @?

sta*_*mer 4 c++ memory-address

我运行以下代码:

    #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;
    }
Run Code Online (Sandbox Code Playgroud)

输出是:

    ab@
    b@
    0x28fe94
    0x28fe98
Run Code Online (Sandbox Code Playgroud)

起初,我认为这是&和之间优先的结果..
但是0x28fe940x28fe94指出它不是优先问题.
我可以找出什么是ab@b@是什么意思?

tem*_*def 5

当你写作

 cout << &test.a
Run Code Online (Sandbox Code Playgroud)

因为test.a是a char,这将调用operator<< (ostream&, const char*)重载,认为你char*是一个指向C风格字符串的指针,而不是指向一个字符的指针.因此,操作将从内存地址开始读取字节,&test.a直到找到空终止符(零字节).打印输出会发生这种情况ab@,因为它a具有值'a',b有值'b',并且系统上的数字478恰好对应于@最后跟随空字节的字符.

如果你想看到的数字地址test.atest.b,投的指针void*s,这将选择operator<< (ostream&, const void*)超载.例如:

cout << static_cast<void*>(&test.a)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!