day45.多維數組

第45節:多維數組

1、多維數組的定義

比如:一個班5個組,每個組9個人:
int arr[45] 或者 int arr[5*9] 再或者可以:int arr[5][9]

比如:一個縣有5個學校,每個學校有3個年級,每個年級有4個班,每個班有5個組,每個組有9個人:
int arr[5*3*4*5*9] 或者 int arr[5][3][4][5][9]

int arr[5][3][4][5][9] 這種類型稱爲多維數組。

2、多維數組的初始化
例子:
int arr[3][4]{
      {1,2,3,4},
      {4,5,6,7},
      {7,8,9,10}
};

現在要思考一個問題了:這個二維數組它在內存中如何排列的?是連續存儲的,二維或者一維只是給使用者的一種概念,在底層編譯完後,根本沒有二維、三維、四維的說法。只有連續存儲的概念,無論你是幾維在內存中都是一個一個存取起來的。上面的例子存儲形式是:

反彙編代碼如下:
6:        int arr[3][4]={
7:            {1,2,3,4},
00401028   mov         dword ptr [ebp-30h],1
0040102F   mov         dword ptr [ebp-2Ch],2
00401036   mov         dword ptr [ebp-28h],3
0040103D   mov         dword ptr [ebp-24h],4
8:            {5,6,7,8},
00401044   mov         dword ptr [ebp-20h],5
0040104B   mov         dword ptr [ebp-1Ch],6
00401052   mov         dword ptr [ebp-18h],7
00401059   mov         dword ptr [ebp-14h],8
9:            {9,10,11,12}
00401060   mov         dword ptr [ebp-10h],9
00401067   mov         dword ptr [ebp-0Ch],0Ah
0040106E   mov         dword ptr [ebp-8],0Bh
00401075   mov         dword ptr [ebp-4],0Ch
10:       };

看到這裏大家應該就明白了一維數組和二維數組存儲的方式都是一樣的,連續的存儲。大家可能有疑問,爲什麼還要用二維數組和多維數組,乾脆用一維數組算了。多維數組給我們的好處就是給使用的人比較方便。比如:我要才第2組第4個人是多少,這樣如果使用一維數組的話就得查,如果使用二維數組的話馬上一眼看過去就知道了。(以上例子:第2組第4個人就是8)

3、二維數組的讀寫
比如:一年有12月,每個月都有一個平均氣溫,存儲5年的數據
int arr[5][12]={
  {1,2,1,4,5,6,7,8,9,1,2,3},
  {1,2,1,4,5,6,7,8,9,1,2,3},
  {1,2,1,4,5,6,7,8,9,1,2,3},
  {1,2,1,4,5,6,7,8,9,1,2,3},
  {1,2,1,4,5,6,7,8,9,1,2,3}

}


假設如果要取第1年第9個數據就是:arr[0][8]。如果要取第2年第8個數據就是 arr[1][7]。
編譯器來查找數據是:arr[0*12+8] 和 arr[1*12+7]

4、多維數組的讀寫

比如:一共有5個班,每個班有4個組,每個組3個人

int arr[5][4][3] = {
    {{1,2,3}.{4,5,6},{7,8,9}{10,11,12}},
    {{13,14,15}.{16,17,18},{19,20,21}{22,23,24}},
    {{25,26,27},{28,29,30},{31,32,33},{34,35,36}},
    {{37,38,39},{40,41,42},{43,44,45},{46,47,48}},
    {{49,50,51},{52,53,54},{55,56,57},{58,59,60}}
}


假設要找的是第2班,第2個組,第2個人是:arr[1][1][1]。
編譯器是怎麼做的呢? arr[1*4*3+1*2+1]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章