2011-10-21 40 views
4

在以下情況下,每個成員都有不同的名稱或實體,爲什麼他們的地址相同?爲什麼班級成員與他們的對象具有相同的地址?

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

可能是他們在同一類 –

+0

因爲你的記憶看起來像 - 'class'es /'struct's是一個抽象的概念,編譯器可能已經優化了'struct's出來。 (這不是正確的答案,但需要考慮。) –

回答

8

因爲指針的結構總是指向它的第一構件(與結構被佈置順序地)。

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

(C1X§6.7.2.1.13:「A指針的結構對象,適宜地轉換 ,點到它的初始構件...,反之亦然可能 是無名填充內,結構對象,而不是在其 開始「)

注:奶源指出,這是理所當然的,如果你開始添加虛函數到您的結構,C++通過黏合個實現此在你的struct開始的時候vtable ...這使得我的陳述(對C來說是真實的)在你談論你可能用C++中的'structs'做的所有事情時是不正確的。

+2

考慮到'cout',它看起來比'C'多了'C++',所以通常指向結構的指針並不總是指向它的第一個成員。 (以防有人瀏覽你的鏈接,並沒有注意到它們之間的區別) – mange

+0

廢話......結構在C中的工作方式與在C++中的工作方式相同...並且OP對cout的使用除了點。 – Steve

+1

在'C++'中''struct'只是一個'class',默認訪問'public'而不是'private'。如果你添加一個具有虛函數的'struct',它將得到一個vtable指針,這將導致它違反上述屬性。 'cout'的使用表明它是'C++',而不是'C',因爲'C'沒有'cout'。 – mange

4

因爲他們是在同一個地方。在struct A的第一個元素是struct B,使他們在同一個存儲位置(在任何其他struct A將隨後b後放)實際上是。

同樣,xstruct B中的第一位數據,所以它的位置與struct B相同。

注意,這不會永遠是真正的這是非常重要的。像虛擬功能這樣的東西會導致東西移動。在這種情況下是真的,因爲它們是普通的類/結構體。

+0

+1「像虛擬功能一樣會引起東西移動。」 – Steve

3

如果站在你的國家的邊界​​與一杯咖啡在你的手那麼你的座標,邊界的座標和咖啡杯的座標都將有一個GPS設備上相同的值。

第一個孩子的第一個元素恰好是在對象的起始地址。名稱是爲了您自己的便利計算機使用內存地址。您可以隨意命名它們,但內存佈局取決於數據成員的順序和層次結構。

+4

有趣的比喻... – Steve

相關問題