陣列
一個名字,裝一整排東西。 · ⏱ 約 30 分鐘
你會學到三件事
- 一個名字怎麼裝很多個值
- 陣列和
for 迴圈為什麼是天生一對
- 越界:拿一個不存在的位置會發生什麼
開始之前
想記住五個分數,用現在會的東西只能:
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];),
然後從第二個開始一個一個比,比它大就換掉。
這一課你做了什麼
- 你用一個名字裝了五個值
- 你用
for 走過了整排
- 你知道
a[5] 在一個五格的陣列裡是不存在的,而 C++ 不會攔你
如果卡住了
| 你看到 |
多半是因為 |
| 總和多了一個怪數字 |
迴圈跑到 a[5] 了。條件應該是 i < 5 |
| 程式莫名其妙當掉 |
越界寫入(a[10] = 1;)——它會踩到別人的記憶體 |
int a[n] 說 n 不是常數 |
格數要是編譯時就知道的值。用 const int 或下一課的 vector |
| 最大值答案是 0 |
mx 從 0 開始了。要從 a[0] 開始(負數的時候 0 會是錯的) |
在編輯器打開這一課 →