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

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

本文关键字:对象 地址 成员 为什么      更新时间:2023-10-16

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

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:"指向结构对象的指针,合适转换后,指向其初始成员…反之亦然。有可能在结构对象内填充,但不在其开始。")

注意: manage指出,如果你开始在结构体中添加虚函数,c++通过在结构体的开头添加虚函数表来实现这一点。这使得我的陈述(这对C来说是正确的)不正确,当你谈论你可以用c++中的"结构"做的一切。

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

同样,xstruct B的第一个数据位,因此它与struct B在相同的位置。

需要注意的是,这并不总是正确的。像虚函数这样的东西会导致物体移动。在这种情况下是正确的,因为它们是普通的类/结构。

如果你站在你的国家边境,手里拿着一杯咖啡,那么你的坐标,边界的坐标和咖啡杯的坐标在GPS设备上都是相同的值。

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