關於結構體和C 類的記憶體位址問題

2021-09-06 12:46:55 字數 1098 閱讀 5296

關於結構體和c++類的記憶體位址問題

今天終於有時間寫點東西了~ 太爽了  *_*

很多人都知道c++類是由結構體發展得來的,所以他們的成員變數(c語言的結構體只有成員變數)的記憶體分配機制是一樣的。下面我們以類來說明問題,如果類的問題通了,結構體也也就沒問題啦。

類分為成員變數和成員函式,我們先來討論成員變數。

乙個類物件的位址就是類所包含的這一片記憶體空間的首位址,這個首位址也就對應具體某乙個成員變數的位址。(在定義類物件的同時這些成員變數也就被定義了)我們來以一段**說明問題:

//類的定義

class k

~k(){}

int k;

};//類的使用

//...

k ktemp;

printf("%d--%d\n",&ktemp,&ktemp.k);

printf("%d--%d\n",sizeof(k),sizeof(ktemp.k));

int *i = (int*)(&ktemp);

int w = *i;

printf("%d\n",w);

執行上面的**,結果如下:

1310588--1310588

4--4

12很明顯,類的記憶體大小和其唯一的成員變數的記憶體大小是一致的。記憶體位址也是一致的。

他們甚至可以相互轉換。換成結構體結果也是一樣。網友可以自己執行上面**來進行確認。

這個時候,可能有人會提出疑問了。那麼成員函式又如何?上面得**就好像類沒有任何成員函式一樣,根本說明不了問題。

呵呵,所有的函式都是存放在**區的,不管是全域性函式,還是成員函式。

要是成員函式占用類的物件空間,那麼將是多麼可怕的事情:定義一次類物件就有成員函式占用一段空間。

我們再來補充一下靜態成員函式的存放問題吧:

靜態成員函式與一般成員函式的唯一區別就是沒有this指標,因此不能訪問非靜態資料成員,就像我前面提到的,所有函式都存放在**區,靜態函式也不例外。所有有人一看到 static 這個單詞就主觀的認為是存放在全域性資料區,那是不對的。(當然正在看我部落格的網友應該不至於犯這樣的問題,但是林子大了什麼鳥都有嘛,我在這裡多寫兩句,希望各位網友不要嫌我囉嗦哦)

原創,請**者附上下面**

關於記憶體和記憶體位址的詳解

記憶體位址用4位16進製制和8位16進製表示的區別。例如經常可以看到某些書籍上寫的記憶體位址0x0001,在另外一些書籍上寫的記憶體位址又變成了0x00000001。都是表示的編號為1的記憶體位址,為什麼乙個是4位16進製表示,另外乙個又是用8位16進製表示呢?首先,必須要知道記憶體位址只是乙個編號...

關於記憶體位址和記憶體空間的理解

1.記憶體位址用4位16進製制和8位16進製表示的區別。例如經常可以看到某些書籍上寫的記憶體位址0x0001,在另外一些書籍上寫的記憶體位址又變成了0x00000001。都是表示的編號為1的記憶體位址,為什麼乙個是4位16進製表示,另外乙個又是用8位16進製表示呢?首先,必須要知道記憶體位址只是乙個...

關於記憶體位址和記憶體空間的理解

1.記憶體位址用4位16進製制和8位16進製表示的區別。例如經常可以看到某些書籍上寫的記憶體位址0x0001,在另外一些書籍上寫的記憶體位址又變成了0x00000001。都是表示的編號為1的記憶體位址,為什麼乙個是4位16進製表示,另外乙個又是用8位16進製表示呢?首先,必須要知道記憶體位址只是乙個...