多次元配列: 表と行列

表計算ソフトのようなデータ構造。内実は1列に並んでいる。

多次元配列
配列の配列。表や行列、3D空間などを表現する。
行優先 (Row-major)
メモリ上では「行」ごとに並んでいること。
ホテルの部屋番号 (Hotel Rooms)

多次元配列は「ホテルの部屋」です。 `matrix[2][3]` は「2階の3号室」と読むことができます。 ただし、メモリという土地は細長いので、実際には「1階の部屋が全部並んだ後に、すぐ2階の部屋が続く」という形で、横一列に並んでいます(Row-major)。だから「2階の最後の部屋」の隣は「3階の最初の部屋」なんです。

表形式のデータ

画像データ(縦×横)やボードゲームの盤面、行列計算などを扱うために、2次元以上の配列を使います。

C言語では 配列[行][列] のように大括弧を繋げて宣言します。

メモリ上の配置

「2次元」と言いますが、実際のメモリは1本の長いテープです。C言語では 「行を順番に並べる(Row-major)」方式で格納されます。 [0][0], [0][1], ... [1][0]... の順です。この順番通りにアクセスするとキャッシュ効率が良く、高速に動作します。

2次元配列

Matrix Declaration
// 3行4列の表 (Excelのようなもの)
int matrix[3][4] = {
{1, 2, 3, 4}, // 0行目
{5, 6, 7, 8}, // 1行目
{9, 10, 11, 12} // 2行目
};
// アクセス: matrix[行][列]
printf("%d\n", matrix[1][2]); // 7
Nested Loop Traversal
// 多次元配列の走査(二重ループ)
// 外側が行(y)、内側が列(x)が基本
for(int i = 0; i < 3; i++) { // y: 行
for(int j = 0; j < 4; j++) { // x: 列
printf("%3d ", matrix[i][j]);
}
printf("\n");
}

実践テクニック

ループ順序の重要性

二重ループを書くときは、原則として外側を行(i)、内側を列(j)にします。これはメモリの並び順と同じなので、CPUが効率よくデータを読み込めます。逆(列ループを外)にすると、飛び飛びのアクセスになり遅くなることがあります。

演習課題

課題1: 九九の表
9x9の2次元配列を用意し、九九の結果を代入してから、きれいに表示してください。

合格ライン

2次元配列の宣言と初期化ができる
二重ループで全要素を表示できる