繁体   English   中英

为什么类成员与其对象具有相同的地址?

[英]Why do class members have the same address as their object?

在以下情况下,每个成员都有不同的名称或实体,那么为什么他们的地址相同?

struct B { int x; };
struct A { B b; };

int main()
{
    A obj;
    cout << &obj.b.x << endl;
    cout << &obj.b << endl;
    cout << &obj << endl;
}

因为指向结构的指针始终指向其第一个成员(因为该结构是按顺序排列的)。

在C语言中,指向结构的指针是否始终指向其第一个成员?

(C1x第6.7.2.1.13节:“经过适当转换的指向结构对象的指针指向其初始成员……反之亦然。在作为结构对象的内部可能有未命名的填充,但在其开始处没有。”)

注意: mange正确地指出,如果您开始向结构中添加虚拟函数,则C ++通过在结构的开头添加vtable来实现此目的……这使我的声明(对于C是正确的)在您使用时不正确讨论您可以在C ++中使用“结构”进行的所有操作。

因为他们在同一个地方。 struct A的第一个元素是struct B ,因此它们实际上位于相同的内存位置(然后, struct A其他任何内容都将放在b之后)。

同样, xstruct B中数据的第一位,因此它与struct B处于同一位置。

需要特别注意的是,这并不总是正确的。 诸如虚拟功能之类的事物将导致事物移动。 在这种情况下是正确的,因为它们是简单的类/结构。

如果您手持一杯咖啡站在您国家的边界​​,那么您的坐标,边界坐标和咖啡杯的坐标在GPS设备上都将具有相同的值。

第一个孩子的第一个元素碰巧在对象的起始地址。 名称是为了方便您使用,计算机使用内存地址。 您可以随意命名,但内存布局取决于数据成员的顺序和层次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM