为什么班级成员的地址与他们的对象相同?

时间:2011-10-21 04:33:00

标签: c++

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

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

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

3 个答案:

答案 0 :(得分:8)

因为指向结构的指针总是指向它的第一个成员(因为结构是按顺序排列的)。

In C, does a pointer to a structure always point to its first member?

  

(C1x§6.7.2.1.13:“适当地指向结构对象的指针   转换后,指向其初始成员......反之亦然。也许有   在结构对象中是未命名的填充,但不在其中   开始“。)

注意: mange指出,理所当然,如果你开始向你的struct添加虚函数,C ++通过在你的struct的开头添加vtable来实现这个...这使我的声明(对于C来说这是正确的)当你谈论你可能用C ++中的'structs'做的所有事情时,这是错误的。

答案 1 :(得分:4)

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

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

值得注意的是,这并非总是如此。像虚函数这样的东西会导致东西移动。在这种情况下确实如此,因为它们是普通的类/结构。

答案 2 :(得分:3)

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

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