上一篇介紹了一維陣列的用法還有如何宣告,今天就來介紹二維陣列
還有一些我們在寫 code 時需要注意的一些小習慣。
[ Review ]
在上次,我們提到了,
我們在宣告陣列的時候,就像是在宣告一個陣列的初始位置。
像是這樣:
int Array[10] = {0};
cout << Array;
結果就會跑出一段位於記憶體上面的位置。像是0x6ffe10
之類的
如果我們今天宣告一個陣列: 然後檢查看看他的大小,可以更了解這個概念:
int Array[] = {1, 2, 3};
cout << sizeof(Array) << "\n"; // 就像是一棟大樓
cout << sizeof(Array[0]); // 就像是一棟大樓的第一戶人家
這樣第一行就會印出 12
。
第二行就會印出 4。
二維陣列的宣告就跟一維的差不多:
(列) (欄)
*data type* *array name* [ rows ] [ columns ];
就只是在列數的後面加上一個欄數
所以如果我們這樣宣告:
int ArrayExample [3] [7];
如果把它圖像化會長成這樣:
其實可以想像成,有三個一維陣列,每一個陣列裡面有 7 個項目(變數)
像這樣:
[0] : [0][0] 、[0][1] 、[0][2] 、[0][3] 、[0][4] 、[0][5] 、[0][6] 。
[1] : [1][0] 、[1][1] 、[1][2] 、[1][3] 、[1][4] 、[1][5] 、[1][6] 。
[2] : [2][0] 、[2][1] 、[2][2] 、[2][3] 、[2][4] 、[2][5] 、[2][6] 。
如果我們今天要把資料輸入進去的話,
可以先記得,排列的方式是長這樣:
1.[0][0]
2.[0][1]
3.[0][2]
4.[0][3]
........
但為什麼不先換行再換列呢,像是這樣
1.[0][0]
2.[1][0]
3.[2][0]
4.[3][0]
........
詳細原因的話等等會說明。
例子:
int Array1[2][3] = {{4, 5, 6}, {7, 8, 9}};
int Array2[2][3] = {4, 5, 6, 7, 8, 9}
如果是這樣子宣告的話,他的二維陣列示意圖會長這樣:
位置圖是這樣:
[0][0] [0][1] [0][2]
[1][0] [1][1] [1][2]
那如果是這樣宣告:
int Array3[2][3] = {{4, 5}{7, 8, 9}}
畫成示意圖會長這樣:
可以看到
[0][0] [0][1] [0][2]
[1][0] [1][1] [1][2]
在[0][2]
的地方變成了 0
,而我們在宣告的時候,因為第一列的數字只有宣告{4, 5}
,所以當最後一項並沒有宣告數字,所以變成了原本存在於記憶體那個位置的數字 0
。
再下面這個例子中可以看到,
int Array4[2][3] = {4, 5, 6, 7, 8};
我們宣告了六個陣列變數的位置,但是只有給他五個數字,因此會得到:
這樣子的結果,如果依照下面這張位置對比的話,就可以發現,他真的是按照
[0][0] → [0][1] → [0][2] → [1][0] → [1][1]
這個順序下去,所以在最後一項會變成 0。
例如今天宣告一個 2*3
的陣列
int Array[2][3] = {0};
在記憶體裡面,位置的排列是這樣子:
正因為他是這樣子排列,所以當你輸入數字的時候,就會是依照這樣的順序輸入。
那如果今天要輸入一個二維陣列的時候要怎麼辦呢?
其實很簡單,用兩個迴圈就可以解決了。
int Array[3][5] = {0};
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
cin >> Array[i][j];
}
}
這樣就可以把想要的數值輸入到二維陣列裡面去了。
如果不太懂兩層迴圈的,可以這樣子想:
先從第一層開始想:
從 i = 0 開始 :
j = 0
j = 1
j = 2
j = 3
j = 4
接下來就會變成
i = 1:
裡面又有
j = 0
j = 1
j = 2
j = 3
j = 4
以此類推。
曾經有一個厲害的人說過, "Always initialize your Variables"
現在已經變成我寫程式的時候銘記在心的一句金句。
之前我們也提過,變數都要初始化,像是
double Variable1 = 0.5;
int Variable2 = 0;
long Variable3 = 1;
只要你宣告的時候,就要給他初始化一下。
那陣列呢,當然也要啦!
int Array1[6][7] = {0}; //這樣子宣告的話就會每一項都是 0
先宣告一個 const,再宣告 array !
例如我們要宣告一個長度為 10 的 array
理論上我們要這麼做:
首先要先 allocate a const.
const int VALUE_LEN = 10;
再來才是宣告array的長度
float value[VALUE_LEN] = {0};
這樣的好處是,如果你今天要改陣列的長度,可以直接從宣告的 const 改,這樣就不用每一項都要
改改改改改了。
陣列不能互相宣告
像是
int a[5] = {0};
// RIGHT
// WRONGint b[5] = a;
陣列不能比大小或是拿來做運算啦
以上兩點的原因,都是因為我們前天提到的: 我們所宣告的陣列只是一個位置,並不是一個值
所以就不能拿來運算、比大小、或者宣告啦 !
每次遇到迴圈在亂搞的時候,其實慢慢的一圈一圈想,你的大腦可能會發展到不同層次。