取消引用结构以获取第一个成员的值

Dereference a structure to get value of first member

本文关键字:成员 第一个 获取 引用 结构 取消      更新时间:2023-10-16

我发现结构的第一个元素的地址与结构的地址相同。但是取消引用结构的地址不会返回第一个数据成员的值。但是,取消引用第一个数据成员的地址确实会返回其值。例如。结构的地址=100,结构的第一个元素的地址也是100。现在,取消引用应该以相同的方式在两者上工作。

法典:

#include <iostream>
#include <cstring>
struct things{
    int good;
    int bad;
};
int main()
{
    things *ptr = new things;
    ptr->bad = 3;
    ptr->good = 7;
    std::cout << *(&(ptr->good)) <<" " << &(ptr->good) << std::endl;
    std::cout << "ptr also print same address = " << ptr << std::endl;
    std::cout << "But *ptr does not print 7 and gives compile time error. Why ?" << *ptr << std::endl;
    return 0;
}

*ptr返回一个类型为 things 的实例,没有定义operator <<,因此编译时错误。

结构与数组不同。也就是说,它不一定衰减到指向其第一个元素的指针。事实上,编译器可以自由(并且经常)在结构中插入填充,以便它与某些字节边界对齐。因此,即使struct可以像数组一样衰减(坏主意),简单地打印它也不能保证打印第一个元素!

我的意思是像 int[] 这样的 C 样式数组

这些边界依赖于实现,通常可以通过预处理器语句以某种方式控制,例如pragma pack

尝试以下任一方法:

#include <iostream>
#include <cstring>
struct things{
    int good;
    int bad;
};
int main()
{
    things *ptr = new things;
    ptr->bad = 3;
    ptr->good = 7;
    std::cout <<  *(int*)ptr << std::endl;
    std::cout <<  *reinterpret_cast<int*>(ptr) << std::endl;
    int* p = reinterpret_cast<int*>(ptr);
    std::cout <<  *p << std::endl;
    return 0;
}

您可以强制转换指向 Struct 的指针,指向结构的第一个元素的指针,以便编译器知道使用什么大小和对齐方式从内存中收集值。如果你想要一个"干净"的强制转换,你可以考虑先将其转换为"VOID 指针"。
_ (结构*) 到 (VOID*) 到 (FirstElem*) _
另请参阅:Stackoverflow
中的指针希望对您有所帮助!!

我发现结构的第一个元素的地址与结构的地址相同。

无论你在哪里发现这一点,它都不是 c++ 标准。在一般情况下,这是一个不正确的假设。

如果你继续沿着这条道路走下去,对你来说只有苦难和痛苦。