C語言簡介:陣列

本文為C語言簡介系列第五篇文章,前一篇文章為C語言簡介:迴圈控制

我們常可以在車站、健身房等場所看到公共置物櫃方便我們放置物品,而置物櫃有編號第0號、第1號、第2號、第3號…每個櫃子都能放一個東西,這排櫃子就有點像是陣列的概念。

宣告

int arr[5] = {1, 2, 3, 4, 5};

本行程式的意思是說:我要宣告一個叫做 arr 的陣列,而這個陣列有5個位子。大家可以想像成這是在宣告一個叫做 arr 的櫃子,而這個櫃子共有5個位子可以放東西。
在這段宣告中我們可以看到我們在 arr 裡面存放了5個元素,分別是 12345。那我們如何使用這5個元素呢?
當我要印出 4 時,我們可以寫

printf("%d", arr[3]);

明明 4 是陣列裡第4個元素,為什麼不是 arr[4] 呢?

第0號櫃

實際上,C語言中,陣列的第1個元素,其索引值其實是 0 而不是 1
所以!在 arr 陣列中,1 的索引值為 02 的索引值為 1……以此類推。

初始化

在我們宣告一個陣列後,我們會希望陣列內的值都是受我們控制的、指定的值才存入,對吧?
此時我們會需要一個叫做初始化的步驟!
聽起來很耳熟對吧!
C語言簡介:基本輸入輸出我們曾提過這個概念
當時我說

那我可以宣告變數後不賦值嗎?
先說答案:可以。
但是,實務上通常建議宣告後初始化,避免「垃圾值」可能帶來的困擾。

在本篇「陣列」的概念中,初始化的理由跟在「變數」的概念一樣,都是為了避免「垃圾值」帶來的影響。
那如何初始化呢?
我們可以在宣告時這樣寫

int anotherArr[10] = {0};

這裡,我們宣告了一個長度為10、叫做 anotherArr 的陣列,與前面宣告 arr 時不同的是,我賦值的部分寫的是 {0},這樣我們就完成了陣列的初始化,從 anotherArr[0]anotherArr[9] 的值都是 0

陣列的輸入/輸出

輸入

當我們要依序將資料輸入陣列裡時,可以使用 for 迴圈。
舉例如下:

array_input.c
1
2
3
4
5
6
7
8
#include <stdio.h>
int main() {
int a[5] = {0};
for (int i = 0; i < 5; i++) {
scanf("%d", &a[i]);
}
return 0;
}

可以看到

4
5
6
for (int i = 0; i < 5; i++) {
scanf("%d", &a[i]);
}

我們利用這個結構可以依序輸入資料到陣列中。
至於為什麼 for 的條件式是 i < 5 是因為我們前面提過在C語言中,陣列的索引值是從 0 開始,所以最後一個元素的索引值是 陣列長度 - 1

輸出

而輸出的部分則與輸入的方法相似。當我要依序輸出陣列內容時,我們可以利用

array_output.c
1
2
3
4
5
6
7
8
#include <stdio.h>
int main() {
int a[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("%d\n", a[i]);
}
return 0;
}

來完成。

試試看

請試宣告一個陣列,當使用者輸入

1 2 3 4 5 6 7 8 9 0

請輸出

0 9 8 7 6 5 4 3 2 1 

試試看

請試宣告一個長度為10的陣列,並依序輸入數值,然後輸出剛剛所輸入的最大值。

二維陣列

二維陣列像是一張表格(table)。

二維陣列宣告

int arr[3][5] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 0},
{1, 3, 5, 7, 9},
};

這裡我們宣告了一個3×5的二維陣列。
至於讀取資料的方法與前面提到的一維陣列很像!

printf("%d", arr[1][3]);

就會輸出 9 囉!

二維陣列的初始化

二維陣列的初始化跟一維陣列也很像!
我們可以這樣寫

int another2DArr[5][5] = {0};

這樣初始化就完成囉!

二維陣列的輸入/輸出

你大概也猜到我要說什麼了!
沒錯!二維陣列的輸入/輸出長得跟一維陣列的輸入/輸出很像!
只是稍微麻煩了一些

輸入

當我們要將數值依序輸入時,可以使用兩個 for 迴圈。舉例如下:

array2d_input.c
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main() {
int a[2][3] = {0};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
scanf("%d", &a[i][j]);
}
}
return 0;
}

而為何兩個 for 迴圈的條件式要這樣設定,原因則與上面(一維陣列的輸入/輸出)所提到的相同,在此不多贅述。

輸出

輸出的部分與輸入的方法相似。舉例如下:

array2d_output.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main() {
int a[2][3] = {
{1, 2, 3},
{4, 5, 6},
};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}

註:外層 for 迴圈的 printf("\n") 是為排版美觀,非必要。

結語

以上就是C語言陣列簡介。
雖經過校對,本文內容仍可能有錯誤之處。
倘內容有誤或仍有疑問,歡迎在下方留言區留言!