我最近試圖通過將幾個指針的值打印到控制檯來調試一個小程序。第一個是結構的內存地址,其他的是其字段的內存地址。代碼的精簡版本如下:指向結構或類的指針與指向第一個字段的指針
#include <iostream>
struct testingPointers
{
int i;
float f;
double d;
} test;
int main()
{
std::cout << &test << '\n' << &(test.i) << '\n' <<
&(test.f) << '\n' << &(test.d);
}
,輸出是:
0x681110
0x681110
0x681114
0x681118
(明顯的準確值是不同的運行不同,但他們總是有相對於相同的位置彼此)。
我很困惑,因爲第一個指針的值 - test
的內存位置 - 與第二個(test
的第一個字段)的值相同。這是否意味着對象沒有真正獨特的內存地址,並且指向結構或類的指針只是指向它的第一個字段?如果是這樣,怎麼辦之類的語句
a.b
a->b
a.b()
意義,如果a
實際上只是它的第一場,因此沒有任何字段或方法?
不,它們是不同類型的指針。但是第一個字段位於對象的開始處。所以它有相同的起始地址。 (除非有一個vtable指針或開始的東西。) –
如果一個指向我自己頂部的指針也是一個指向我頭頂的指針,這是否意味着我不存在,因爲我真的只是一個頭? –
@MooingDuck令人毛骨悚然。 –