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

标签 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;
    }

输出是:

    ab@
    b@
    0x28fe94
    0x28fe98

起初,我认为这是&之间的优先级的结果。
但是0x28fe940x28fe94说明不是优先级的问题。
我能弄清楚 ab@b@ 是什么意思?

最佳答案

当你写作时

 cout << &test.a

因为test.achar , 这将调用 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/

相关文章:

c# - C#获取外部进程的线程起始地址

成员函数中的 C++ 静态变量

C++ 编译错误枚举 "does not name a type"

python - 访问对象存储器地址

c++ - 指向单链表中内存地址的指针,其中没有变量表示每个元素

c - C 中指针与整数相加

c++ - Linux下如何用C++创建进程?

c++ - 无法运行简单的 std::async 和 std::future 测试程序。错误: "has initializer but incomplete type."发生了什么事?

用于移动应用程序开发的 C++ 跨平台框架

python - 在python中访问内存地址