Semorphe

陣列

一個名字,裝一整排東西。 · ⏱ 約 30 分鐘

你會學到三件事

  1. 一個名字怎麼裝很多個
  2. 陣列和 for 迴圈為什麼是天生一對
  3. 越界:拿一個不存在的位置會發生什麼

開始之前

想記住五個分數,用現在會的東西只能:

int a1 = 3, a2 = 1, a3 = 4, a4 = 1, a5 = 5;

那一百個呢?而且——你沒辦法用迴圈處理它們,因為每個名字都不一樣。

一、宣告一排

int a[5] = {3, 1, 4, 1, 5};
這一段 意思
int 裡面每一格都是整數
a 這一整排的名字
[5] 五格
= {3, 1, 4, 1, 5} 一開始各裝什麼

二、拿第幾格

cout << a[0] << endl;    // 3   ← 第一格
cout << a[4] << endl;    // 5   ← 第五格,也是最後一格

⚠️ 又是第 7 課那件事:位置從 0 開始

   3     1     4     1     5
  a[0]  a[1]  a[2]  a[3]  a[4]
                            ↑ 五格,而最後一格是 [4]

a[5] 不存在。 而 C++ 不會攔你——它會給你旁邊那塊記憶體裡 剛好放著的東西,可能是垃圾、可能讓程式當掉、也可能看起來一切正常。

這是 C++ 最危險的一件事,而它不會報錯。

三、陣列和 for 是天生一對

方括號裡面可以放變數

int sum = 0;
for (int i = 0; i < 5; i++) {
    sum = sum + a[i];
}
cout << sum << endl;     // 14

i 從 0 走到 4,a[i] 就依序是每一格。

上一課那個形狀現在有意義了:

for (int i = 0; i < 5; i++)
              ↑
       正好走過 [0] 到 [4],一格不多一格不少

⚠️ 寫成 i <= 5 的話,最後一圈會碰到 a[5]——那一格不存在

四、格數要寫成一個名字

const int N = 5;
int a[N] = {3, 1, 4, 1, 5};
for (int i = 0; i < N; i++) { ... }

const 的意思是「這個值不准改」。

好處是:想改成 10 格的時候,只要改一個地方。 把 5 散在三處的話,改漏一處就是越界,而它不會報錯。

完成的樣子

int main() {
    int a[5] = {3, 1, 4, 1, 5};
    int sum = 0;
    for (int i = 0; i < 5; i++) {
        sum = sum + a[i];
    }
    cout << sum << endl;
    return 0;
}

換你了

找出這五個數字裡最大的那個

提示:先假設第一個是最大的(int mx = a[0];), 然後從第二個開始一個一個比,比它大就換掉。

這一課你做了什麼

如果卡住了

你看到 多半是因為
總和多了一個怪數字 迴圈跑到 a[5] 了。條件應該是 i < 5
程式莫名其妙當掉 越界寫入(a[10] = 1;)——它會踩到別人的記憶體
int a[n] 說 n 不是常數 格數要是編譯時就知道的值。用 const int 或下一課的 vector
最大值答案是 0 mx 從 0 開始了。要從 a[0] 開始(負數的時候 0 會是錯的)
在編輯器打開這一課 →