陣列 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]; 來宣告一個陣列。

但這麼宣告有兩個壞處,接下來我們就來說說這兩個壞處。

  1. 未知的初始值
  2. 未來想要給定一個初始值會很麻煩

未知的初始值

我們可能會以為,一開始陣列 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};

總結

這章我們了解到什麼是陣列,以及我們該怎麼使用陣列。簡而言之,陣列就是用來儲存一系列擁有相同型態的資料。

了解陣列對於了解程式碼來說至關重要,這是非常多資料儲存以及讀取的方式之一。

下一章,我們會來介紹另一種常見而且重要的資料型態:字串。