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

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

最佳答案

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

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

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

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

关于c++ - 取消引用结构以获取第一个成员的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41506788/

相关文章:

c++ - 加速 Qt 中的 Oracle 数据库接口(interface) (QOCI)

c++ - 在线程函数中使用数据 vector 时发生线程竞赛

链表中的 C++ 字符数组

c++ - std::sort 指针容器

c++ - 将代码声明转化为文字(引用运算符和取消引用运算符混淆)

c - 在前面取消引用 (void *)

c++ - 如何从一个类中的命名空间初始化所有变量

c++ - 当参数是重载函数时,重载决策如何工作?

c - C中结构的详细教程

c - 与 C 中结构化节点的链表相关的奇怪错误消息