C++: 多次元配列
最終更新:2026-08-31
多次元配列は「配列の配列」。2次元配列は表(行と列)、3次元配列は立方体のような構造を持つ。
1. 2次元配列とは何か?
(1) 1.1 現実の例え
| 日常のシナリオ | プログラミングでの相当 |
|---|---|
| チェスボード | 8x8の2次元配列 |
| 成績表 | 学生×科目の表 |
| 画像のピクセル | 幅×高さの配列 |
(2) 1.2 メモリ内の2次元配列
2次元配列はメモリに行優先で格納される:
TEXT
📖 参照専用
行列: [0][0] [0][1] [0][2]
[1][0] [1][1] [1][2]
メモリ: [0][0], [0][1], [0][2], [1][0], [1][1], [1][2]
2. 宣言と初期化
(1) 2.1 宣言
CPP
int matrix[3][4]; // 3行4列の2次元配列
(2) 2.2 初期化
CPP
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
int identity[3][3] = {
{1, 0, 0},
{0, 1, 0},
{0, 0, 1}
};
3. 要素へのアクセス
CPP
#include <iostream>
int main() {
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
std::cout << matrix[0][0] << std::endl; // 1
std::cout << matrix[1][2] << std::endl; // 6
matrix[0][1] = 10; // 値を変更
return 0;
}
4. ネストしたループ
(1) 4.1 全要素を出力
CPP
#include <iostream>
int main() {
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
std::cout << matrix[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
5. 3次元配列
CPP
int cube[2][3][4]; // 2x3x4の3次元配列
💡 ヒント: 3次元以上の配列は複雑になる。必要がない限り避ける。
▶ サンプル 1:行列の和(難易度 ⭐)
CPP
#include <iostream>
int main() {
int A[2][2] = {{1, 2}, {3, 4}};
int B[2][2] = {{5, 6}, {7, 8}};
int C[2][2];
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
C[i][j] = A[i][j] + B[i][j];
}
}
std::cout << "行列の和:" << std::endl;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
std::cout << C[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
▶ サンプル 2:グリッドを表示(難易度 ⭐⭐)
CPP
#include <iostream>
int main() {
char grid[5][5];
// グリッドを初期化
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
grid[i][j] = '.';
}
}
// 対角線を描画
for (int i = 0; i < 5; i++) {
grid[i][i] = 'X';
}
// グリッドを表示
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
std::cout << grid[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
▶ サンプル 3:行列の転置(難易度 ⭐⭐)
CPP
#include <iostream>
int main() {
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
int transposed[3][2];
// 転置
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
transposed[j][i] = matrix[i][j];
}
}
std::cout << "転置行列:" << std::endl;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
std::cout << transposed[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
❓ よくある質問
Q 2次元配列のサイズは動的に決められる?
A 標準C++では不可。動的サイズが必要なら
std::vector<std::vector<T>>を使う。Q 多次元配列を関数に渡す方法は?
A 2次元以上の次元サイズを指定する必要がある:
void func(int arr[][3], int rows)Q メモリのオーバーヘッドはある?
A Cスタイル配列にはオーバーヘッドがない。連続したメモリブロックとして格納される。
📖 まとめ
- 多次元配列は「配列の配列」
- 2次元配列は
arr[rows][cols]で宣言 - ネストしたループで全要素にアクセス
- メモリは行優先で格納
- 3次元以上は複雑になるため避ける
📝 練習問題
-
初級(難易度 ⭐): 3x3の行列を作成し、対角要素のみを出力。
-
中級(難易度 ⭐⭐): 2つの行列の積を計算するプログラムを書く。
-
上級(難易度 ⭐⭐⭐): シンプルな迷路ゲームを作成:2次元配列で迷路を表現し、プレイヤーが移動できるようにする。