6.9 多維陣列
有時資料是「表格」的形狀。例如棋盤有 8×8 的格子,答題卡有 N 行 M 列的選項。一維陣列放不下這種二維結構,所以我們需要多維陣列。
二維陣列的宣告:
int a[3][4]; // 3 列 4 欄的整數表格
你可以想像成:
- 3 個陣列,每個陣列有 4 個元素
- 訪問方式:
a[列][欄],例如a[0][2]是第 0 列第 2 欄
索引範圍:
- 列的索引:0 ~ 2
- 欄的索引:0 ~ 3
排版:兩個中括號緊緊相連(a[i][j],不是 a[i] [j]),中括號內比照一維的慣例不加空格。
三維及以上:
int cube[5][5][5]; // 5×5×5 的立方體
char matrix[10][20]; // 10×20 的字元矩陣
¶多維陣列的初始化
6.5 的規則原封不動搬過來,只多一條:一組大括號裝一排。
int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; // 完整給好:第 0 排是 1 2 3,第 1 排是 4 5 6
int b[2][3] = {{1}, {4}}; // 每排只給第一格,其餘補 0 → {1, 0, 0} 和 {4, 0, 0}
int c[2][3] = {{1, 2}}; // 只給第 0 排的前兩格,沒提到的第 1 排整排補 0
int d[2][3] = {}; // 全部 0
int e[2][3]; // 什麼都沒給:區域陣列=垃圾值
int f[100][100]; // 全域陣列:自動全 0
規則和 6.5 一模一樣——有寫大括號,沒給到的一律補 0;沒寫大括號時,區域陣列是垃圾值、全域陣列自動全 0。排版也照 1.5 的逗號慣例:逗號後加一個空格,內層大括號之間也是。
= {} 是你最常用的那一個。 多維陣列多半拿來當「一開始全是 0 的表格」——計數表、棋盤、走過沒走過的記錄。這種時候開全域(自動全 0)或寫 = {} 都可以。反過來,如果每一格稍後都會被迴圈填到(像下面的範例程式碼),那不給初值也無所謂,這就是 6.5 的方式 4:先宣告,後初始化。
兩個小地方。 6.5 的「省略陣列大小」在多維只能省第一個中括號:int a[][3] = {{1, 2, 3}, {4, 5, 6}}; 可以,int a[][] 直接編譯錯誤——原因和本節最後的「逐列展開」是同一條,第七單元會談。另外,你也會看到有人把大括號攤平寫成 int a[2][3] = {1, 2, 3, 4, 5, 6};,這樣也對,填的順序就是「逐列展開」那條線;但巢狀寫法一眼就看得出表格的形狀,建議照著寫。
¶範例程式碼
#include<iostream>
using namespace std;
int main() {
// 宣告一個 3 列 4 欄的陣列
int a[3][4];
// 用巢狀迴圈填充
// 外層迴圈:走訪每一列
// 內層迴圈:走訪該列的每一欄
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
a[i][j] = i * 4 + j; // 填充 0, 1, 2, ..., 11
}
}
// 輸出矩陣
cout << "Matrix:\n";
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
cout << a[i][j] << " ";
}
cout << '\n';
}
return 0;
}
執行結果:
Matrix:
0 1 2 3
4 5 6 7
8 9 10 11
動手試試看:把程式碼改成讀入一個矩陣,然後輸出它的轉置(列變欄,欄變列)。