在以下情况下,每个成员都有不同的名称或实体,为什么他们的地址相同?
struct B { int x; };
struct A { B b; };
int main()
{
A obj;
cout << &obj.b.x << endl;
cout << &obj.b << endl;
cout << &obj << endl;
}
答案 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
之后)。
同样,x
是struct B
中的第一位数据,因此它与struct B
的位置相同。
值得注意的是,这并非总是如此。像虚函数这样的东西会导致东西移动。在这种情况下确实如此,因为它们是普通的类/结构。
答案 2 :(得分:3)
如果你手上拿着一杯咖啡站在你国家的边境,那么你的坐标,边框的坐标和咖啡杯的坐标在GPS设备上都会有相同的值。
第一个孩子的第一个元素恰好位于对象的起始地址。名称是为了您自己的方便计算机使用内存地址。您可以根据需要为它们命名,但内存布局取决于数据成员的顺序和层次结构。