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

时间:2017-01-06 13:28:14

标签: c++ structure dereference

我发现结构的第一个元素的地址与结构的地址相同。但解除引用结构地址并不能返回第一个数据成员的值。但是,取消引用第一个数据成员的地址确实会返回它的值。例如。结构的地址= 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;
}

4 个答案:

答案 0 :(得分:1)

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

结构与数组不同。也就是说,它不必衰减到指向其第一个元素的指针。事实上,编译器在结构中是自由的(并且通常是)insert padding,以便它与某些字节边界对齐。所以即使如果 struct可能会以与数组相同的方式衰减(坏主意),只需打印它就不能保证打印第一个元素!

我的意思是像int[]

这样的C风格数组

这些边界是依赖于实现的,通常可以通过预处理器语句(如pragma pack

)以某种方式进行控制

答案 1 :(得分:1)

尝试these中的任何一个:

#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;
}

答案 2 :(得分:0)

您可以将指向Struct 的指针转换为指向结构的第一个元素指针,以便编译器知道要用于收集的大小和对齐方式来自记忆的价值。 如果你想要一个“干净”的演员,你可以考虑先把它转换成“VOID指针”  _(Struct *)到(VOID *)到(FirstElem *)_
另见: Pointers in Stackoverflow
希望它有所帮助!!

答案 3 :(得分:0)

  

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

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

如果你继续沿着这条道路前进,那就没有痛苦和痛苦。