陣列 Array
陣列 array 是什麼呢?在 C++ 中,陣列是一種非常常見的資料結構。
陣列用於儲存一系列具有相同型態的資料。也就是說,如果在此陣列中的第一個資料型態是整數,那麼這個陣列剩餘的所有資料型態也是整數。
而這一系列陣列中的的資料,也是以連續的位置處存在記憶體中。
為什麼要用陣列
想像一下,如果你要記錄 100 位學生的期末考成績,在還沒學會陣列之前,你可能會這樣寫:
int student_1; int student_2; // ... int student_100;
但在學會陣列後,你可以透過下面這一行程式碼,達到和上面一樣的效果:
int students[100]{};
這行程式碼是在告訴編譯器:請建造一個長度為 100,名字為 students
的陣列,並且在此陣列中,所有的資料型態都是整數 int
。
讀取與改寫陣列
那麼我們該如何讀取與改寫陣列中的資料呢?很簡單!我們要利用一個叫 subscipt operator []
的運算子。
以上面的例子來說,當我們要讀取或改寫第五個學生的資料時,我們可以這樣做:
students[4] = 95; // 將第五個學生的資料改為95 int a = students[4]; // 讀取第五個學生的資料,並存入變數a
第一行程式碼讓我們輸入五位學生的成績,第二行則是將他的成績讀取出來。
這裡你們一定會注意到,第五位學生並不是 students[5]
而是 students[4]
,這是因為在 C++ 中,起始索引都是 0。
也就是說,第一位學生是 students[0]
,第二位是 students[1]
,以此類推。
初始化陣列
在前一個例子中,我們看到我們可以用這個簡單的一行程式碼 int students[100];
來宣告一個陣列。
但這麼宣告有兩個壞處,接下來我們就來說說這兩個壞處。
- 未知的初始值
- 未來想要給定一個初始值會很麻煩
未知的初始值
我們可能會以為,一開始陣列 students
的值都是0。但其實這是不對的,一開始的值其實是隨機的。
我們可以透過以下程式碼驗證這個觀念
int main() { int arr[3]; std::cout << "arr[0]: " << arr[0] << std::endl; std::cout << "arr[1]: " << arr[1] << std::endl; std::cout << "arr[2]: " << arr[2] << std::endl; return 0; }
執行以上程式碼後,你會發現初始值真的不是 0!
給定初始值
如果我們想要給每一位學生打分數,那我們就需要寫這樣的程式碼。
三位學生還很簡單,但如果有 30 位學生呢?想必你一定能體會有多少重複又多餘的程式碼了吧!
int students[3]; students[0] = 80; students[1] = 90; students[2] = 76;
解決辦法
很幸運的是!C++ 提供了一個優秀的方法,讓我們可以在宣告一個陣列的同時,也決定了這個陣列擁有的初始值。
這個方法就叫做 initializer list {}
。 我們可以透過以下一行的程式碼得到和上面那個程式碼相同的結果!
int students[3]{80, 90, 76};
如果我們所提供的數少於這個陣列所擁有的空間的話,那麼 C++ 就會將剩下的值都初始為 0。比如說:
int students[3]{80, 90};
這樣的話 students[0]
為 80,students[1]
為 90,而 students[2]
則為 0。
使用 initializer list {}
的好處還有我們也不必提供確切的陣列大小,也就是說下面這兩行程式碼擁有相同的效果!
int students[3]{80, 90, 76}; int students[]{80, 90, 76};
總結
這章我們了解到什麼是陣列,以及我們該怎麼使用陣列。簡而言之,陣列就是用來儲存一系列擁有相同型態的資料。
了解陣列對於了解程式碼來說至關重要,這是非常多資料儲存以及讀取的方式之一。
下一章,我們會來介紹另一種常見而且重要的資料型態:字串。