iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
Software Development

三十天內用C++寫出一個小遊戲系列 第 12

Day 12 - 陣列 b

簡介

上一篇介紹了一維陣列的用法還有如何宣告,今天就來介紹二維陣列

還有一些我們在寫 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};

在記憶體裡面,位置的排列是這樣子:

正因為他是這樣子排列,所以當你輸入數字的時候,就會是依照這樣的順序輸入。


Cin 二維陣列?

那如果今天要輸入一個二維陣列的時候要怎麼辦呢?

其實很簡單,用兩個迴圈就可以解決了。

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

以此類推。


寫 Code 好習慣

  1. 曾經有一個厲害的人說過, "Always initialize your Variables"

    現在已經變成我寫程式的時候銘記在心的一句金句。

    之前我們也提過,變數都要初始化,像是

    double Variable1 = 0.5;
    int Variable2 = 0;
    long Variable3 = 1;
    

    只要你宣告的時候,就要給他初始化一下。

    那陣列呢,當然也要啦!

    int Array1[6][7] = {0}; //這樣子宣告的話就會每一項都是 0
    
  2. 先宣告一個 const,再宣告 array !

    例如我們要宣告一個長度為 10 的 array

    理論上我們要這麼做:

    首先要先 allocate a const.

    const int VALUE_LEN = 10;
    
    

    再來才是宣告array的長度

    float value[VALUE_LEN] = {0};
    

    這樣的好處是,如果你今天要改陣列的長度,可以直接從宣告的 const 改,這樣就不用每一項都要

    改改改改改了。

  3. 陣列不能互相宣告

    像是

    int a[5] = {0}; // RIGHT

    int b[5] = a; // WRONG

  4. 陣列不能比大小或是拿來做運算啦

    以上兩點的原因,都是因為我們前天提到的: 我們所宣告的陣列只是一個位置,並不是一個值

    所以就不能拿來運算、比大小、或者宣告啦 !


心得

每次遇到迴圈在亂搞的時候,其實慢慢的一圈一圈想,你的大腦可能會發展到不同層次。


上一篇
Day 11 - 陣列 a
下一篇
Day 13 - 函式烤肉
系列文
三十天內用C++寫出一個小遊戲30

尚未有邦友留言

立即登入留言