陣列的記憶體布局

2022-05-10 10:28:21 字數 1386 閱讀 2188

先看下面的例子:

int a[5];
1.記憶體布局的示意圖所有人都明白這裡定義了乙個陣列,其包含了5個int型的資料。我們可以用a[0],a[1]等來訪問陣列裡面的每乙個元素,那麼這些元素的名字就是a[0],a[1]…嗎?看下面的示意圖:

如上圖所示,當我們定義乙個陣列a時,編譯器根據指定的元素個數和元素的型別分配確定大小(元素型別大小*元素個數)的一塊記憶體,並把這塊記憶體的名字命名為a。名字a一旦與這塊記憶體匹配就不能被改變。a[0],a[1]等為a的元素,但並非元素的名字。陣列的每乙個元素都是沒有名字的。

2.利用sizeof來研究陣列的記憶體結構關係

那現在再來解決sizeof關鍵字時的幾個問題(本文最下方的參考書): (我想起了王澤梁老師給我們上資料結構課時,介紹資料型別data type的概念:定義了一些資料data,以及基於這些資料的操作operation。)

sizeof(a)的值為sizeof(int)*5,32位系統下為20。

sizeof(a[0])的值為sizeof(int),32位系統下為4。

sizeof(a[5])的值在32位系統下為4。

sizeof(a[5])的值在32位系統下為4。

並沒有出錯,為什麼呢?

因為這裡肯定沒有訪問a[5]這個元素,sizeof只是獲取a[5]型別,而對於a[5]的內容不感興趣。

sizeof是關鍵字

不是函式。函式求值是在執行的時候,而關鍵字sizeof求值是在編譯的時候。雖然並不存在

a[5]這個元素,但是這裡也並沒有去真正訪問a[5],而是僅僅根據陣列元素的型別來確定其

值。所以這裡使用a[5]並不會出錯。

sizeof(&a[0])的值在32位系下為4,這很好理解。取元素a[0]的首位址。計算a[0]的首位址的長度。
sizeof(&a)的值在32位系統下也為4,這也很好理解。計算陣列a的首位址的長度。陳正衝老師vc++老師上做了測試,結果是20。
3. 省**和市政的區別----&a[0]和&a的區別陣列首位址 vs 陣列首元素的首位址

湖南的省**所在地  vs 長沙的市**所在地

這裡&a[0]和&a到底有什麼區別呢?a[0]是乙個元素,a是整個陣列,雖然&a[0]和&a的值一樣,但其意義不一樣。前者是陣列首元素的首位址,而後者是陣列的首位址。舉個例子:湖南的省**在長沙,而長沙的市**也在長沙。兩個**都在長沙,但其代表的意義完全不同。這裡也是同乙個意思。

這個經典例子**陳正衝老師。

參考:陳正衝老師的《c語言深度剖析》。

new物件陣列時的記憶體布局

include include using namespace std define safe delete x define safe delete ary x class ca ca void setter m itest int iin int getter m itest private i...

陣列指標的記憶體布局及例項

首先測試源 如下 include int main void gcc wall p3add1.c p3add1.c in function main p3add1.c 6 18 warning initialization from incompatible pointer type enabled...

陣列指標 指標陣列 位址的強制轉換記憶體布局

1 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。2 陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣列的指標 的簡稱。下面到底哪個是陣列指標,哪個是...