5.1 一維陣列
陣列(Array)的結構
陣列這種資料結構是用來儲存許多相同型別的資料用的。如果我們把變數想像成是一個可以放東西的箱子,那麼陣列就是一堆箱子的集合,而且每個箱子都有一個連續編號的索引值(index)。
例如:我們要儲存 10 個學生的成績(都是整數),我們可以使用這樣一個內含 10 個元素(element)/項目(item)的陣列。

宣告陣列
在程式中我們可以這樣宣告這個陣列 score。
int score[10];
其語法為
其中陣列名稱的命名規則與一般變數的命名規則相同。
要特別注意的是,陣列的索引值是由 0 開紿,所以宣告大小為 10 的陣列 score。可以使用的元素是 score[0]~score[9]。
給定初值
如同變數可以在宣告同時給定初值,陣列也可以。
如果只宣告,但不給定初值,則陣列內各元素的值會無法預測(會是分配到的記憶體當下的值)。
int a[5] = {1, 3, 5, 7, 9};
for(int i=0; i<5; i++)
{
cout << a[i] << " ";
}
初值不給足
如果陣列有 5 個元素,但是初值只給 2 個,剩下 3 個的值會是什麼?
int a[5] = {1, 3};
for(int i=0; i<5; i++)
{
cout << a[i] << " ";
}
觀察執行結果,可以發現它們被設為 0。
所以對於整數陣列,我們常用這樣的技巧來宣告並指定其初值皆為 0。
int a[5] = {0};
for(int i=0; i<5; i++)
{
cout << a[i] << " ";
}
存取陣列中指定元素的值
原則上存取陣列 a 裡索引為 i 的元素值,和一般變數一樣,只要用 a[i] 來表示要存取的元素即可。
練習:讀取學生成績,並接受查詢
讀取使用者輸入的 1~10 號學生成績,並接受以座號查詢其成績。輸入 -1 結束程式。
int score[10] = {0};
for(int i=0; i<10; i++)
{
cin >> score[i];
}
while(true)
{
cout << "輸入座號查詢成績: ";
int id;
cin >> id;
if(id==-1)
break;
cout << id << " 號的成績為 " << score[id-1] << endl; // 想一想,為什麼索引值是 id-1,而不是 id?
}
因為陣列的索引值是由 0 開始編號,和我們一般生活中由 1 開紿編號的情境不同。所以也有人會選擇「浪費一個元素」來讓程式寫起來比較直覺。
int score[11] = {0}; // 宣告 11 個,索引 0 那個不用
for(int i=1; i<=10; i++) // i 由 1~10,而不是 0~9
{
cin >> score[i];
}
while(true)
{
cout << "輸入座號查詢成績: ";
int id;
cin >> id;
if(id==-1)
break;
cout << id << " 號的成績為 " << score[id] << endl; // id 不用減 1 了
}
陣列大小在宣告後無法改變
陣列大小在宣告後無法改變,所以通常我們會宣告「足夠」的大小。例如:在班級成績儲存時,若班級人數不超過 50 人,我們會宣告大小為 50 的陣列。
為什麼陣列的大小不能在程式執行中動態改變呢?
這可能跟陣列的特性有關,陣列有以下的特點:
- 所有元素都是相同型別
- 所有元素在記憶體中相鄰緊密排列
- 可以依索引值快速隨機存取(無需循序)任一內部元素
其中 3 是因為 1, 2 才有辦法做到的。
以下面這個陣列為例:

因為每個元素都是 int,也就是佔記憶體的大小都是 4 byte。所以只要有陣列的開頭位址 0010,和索引 i,就可以知道 score[i] 在記憶體裡的位址為 $$ 0010+i*4$4 $。