多次元配列
[一次元]配列[のようなもの]「[一列のメールボックス]」、[では、もし][表形式のデータ]([例えば]Excel[の表]、[チェス盤]、[行列])[を表す場合は]?
[これには]多次元配列——配列[の中の]配列——が必要になります。
1. 2次元配列
(1) 1.1 2次元配列とは?
2次元配列とは、「配列の配列」——つまり、[各要素自体がまた一つの]配列である。
| [生活シーン] | 番組[での対応] |
|---|---|
| Excel [表]([行] × [列]) | 2次元配列 |
| [盤面](8 × 8) | 2次元配列 |
| [行列](3 × 3) | 2次元配列 |
(2) 1.2 2次元配列の宣言
[文法]:
▶ サンプル 2: codeexample (難易度 ⭐)
;
例:
int matrix[3][4]; // 3 4 'sarray
メモリ[レイアウト]:
matrix[0][0] matrix[0][1] matrix[0][2] matrix[0][3] ← 0
matrix[1][0] matrix[1][1] matrix[1][2] matrix[1][3] ← 1
matrix[2][0] matrix[2][1] matrix[2][2] matrix[2][3] ← 2
💡 [要点]: 2次元配列の[最初の添字は行]、[2番目の添字は列]。
2. 2次元配列の初期化
(1) 2.1 [時]の宣言と初期化
#include iostream
int main() {
//:
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
//:(,)
int matrix2[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
return 0;
}
(2) 2.2 [一部]初期化
#include iostream
int main() {
int matrix[3][4] = {
{1, 2}, //, 0
{5}, //, 0
{} // 0
};
return 0;
}
💡 [ヒント]: [省略された行または列は自動的に] 0 に初期化されます。
3. [アクセス]2次元配列[要素]
(1) 3.1 [要素の読み取り]
#include iostream
int main() {
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
std::cout << ":" << matrix[0][0] << std::endl; // 1
std::cout << ":" << matrix[1][2] << std::endl; // 7
std::cout << ":" << matrix[2][3] << std::endl; // 12
return 0;
}
(2) 3.2 [要素の編集]
#include iostream
int main() {
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
matrix[1][2] = 100; // 100
std::cout << ":" << matrix[1][2] << std::endl; // 100
return 0;
}
4. [反復処理]2次元配列
(1) 4.1 [ネストした] forループ[の反復処理]
#include iostream
int main() {
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
//:
for (int i = 0; i < 3; i++) {
//:
for (int j = 0; j < 4; j++) {
std::cout << matrix[i][j] << "\t";
}
std::cout << std::endl; // ...
}
return 0;
}
出力:
1 2 3 4
5 6 7 8
9 10 11 12
💡 [要点]: [外側の]ループ[で][行]を制御し、[内側の]ループ[で][列]を制御する。
5. 演習:[行列の加法]
(1) ▶ サンプル:1:[2つの] 3×3 [行列の加算] (難易度 ⭐⭐)
#include iostream
int main() {
int A[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int B[3][3] = {
{9, 8, 7},
{6, 5, 4},
{3, 2, 1}
};
int C[3][3]; // ...
// ...
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
C[i][j] = A[i][j] + B[i][j];
}
}
// output
std::cout << "C = A + B:" << std::endl;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
std::cout << C[i][j] << "\t";
}
std::cout << std::endl;
}
return 0;
}
出力:
C = A + B:
10 10 10
10 10 10
10 10 10
6. [3次元]配列([選択科目])
(1) 6.1 [3次元]配列とは何か?
[3次元]配列[とは]「2次元配列[の]配列」のことです。
| [生活シーン] | 番組[での対応] |
|---|---|
| [複数の2次元表が重なっている] | [3次元]配列 |
| [立方体]([長さ] × [幅] × [高さ]) | [3次元]配列 |
(2) 6.2 [和访问]の宣言
#include iostream
int main() {
int cube[2][3][4]; // 2,3,4
// ...
cube[0][1][2] = 5; // 0, 1, 2
cube[1][2][3] = 10; // 1, 2, 3
return 0;
}
💡 [ヒント]: [3次元]配列は[可視化が難しいため]、[通常は] [科学計算]や[コンピュータグラフィックス]でのみ使用されます。[実際の]プロジェクトでは、std::vectorの使用を[優先してください]([後ほど学習します])。
7. [よくある]エラー
(1) 7.1 [下付き文字の順序が逆になっている]
エラー例:
#include iostream
int main() {
int matrix[3][4];
matrix[1][2] = 5; // ✅:Lesson,Lesson
matrix[2][1] = 10; // ✅:Lesson,Lesson
// ❌:andwritereverse
//,
std::cout << matrix[2][1] << std::endl;
return 0;
}
(2) 7.2 配列[インデックスオーバーフロー]
エラー例:
#include iostream
int main() {
int matrix[3][4];
matrix[3][0] = 5; // ❌!max 2
matrix[0][4] = 10; // ❌!max 3
return 0;
}
💡 [ヒント]: 2次元配列 matrix[m][n] の [添字の範囲は]:
- [行]:
0[到]m-1 - [列]:
0[から]n-1
❓ よくある質問
Q:2次元配列はメモリ内にどのように格納されるのか? A:C++の2次元配列は「行優先」(Row-Major)方式です――まず1行目のすべての要素を格納し、次に2行目を格納し、以下同様に格納していきます。 > > 行列[3][4]のメモリ上の配置: > [0] [0] [0][1] [0][2] [0] [3] [1][0] [1][1] ... [2][3] > Q:2次元配列を関数に[どう渡す]のですか? A:配列[名]、[行数]、[列数]を[渡す必要があります]。 > > void printMatrix(int arr[4], int rows) { // [列数は必ず指定]する必要があります! > for (int i = 0; i < rows; i++) { > for (int j = 0; j < 4; j++) { > std::cout << arr[i][j] << "\t"; > } > std::cout << std::endl; > } > } > Q:2次元配列[は動的なサイズに変更できますか]? A:[通常の]配列では[できません]([サイズはコンパイル時に]確定している必要があります)。
[解決方法]:
- [用]
std::vector<std::vectorint>([推奨]、[後ほど学習])- [動的メモリ]の[割り当て]([後ほど学ぶ]ポインタ[と]
new)
Q:multi dimensional arraysについて最も重要なことは何ですか? A:まず核心概念を理解し、その後実践的な例で練習することが重要です。
Q:multi dimensional arraysを効果的に練習するにはどうすればよいですか? A:簡単な例から始め、徐々に複雑さを増やし、常にコードをテストしてください。
📖 まとめ
- 2次元配列[は]「配列[の]配列」であり、[表形式のデータを表現するのに適している]
- [声明]:
type array[名][[行数]][[列数]]; - [アクセス]:
array[名][[行下标]][[列下标]] - [反復処理]:[ネストされた] for ループ([外側の行]、[内側の列])
- C++の2次元配列は[行優先]で[格納]される
- 2次元配列[引数として指定する場合]、[列数を必ず指定する必要がある]
📝 練習問題
- 初心者(難易度 ⭐): [2×3の] 2次元配列を宣言し、[次のように初期化する]:
1 2 3
4 5 6
[その後]この配列を出力します。
- 中級(難易度 ⭐⭐):
[関数]
void transpose(int arr[3], int rows)を記述し、3×3 [行列の転置]([要素の入れ替え])を[計算]する。
1 2 3
4 5 6
7 8 9:
1 4 7
2 5 8
3 6 9
- 上級(難易度 ⭐⭐⭐): [「三目並べ」]という[ゲーム]を[実装]する[プログラム]を作成してください:
-
[用] 3×3の2次元配列[盤面の表示]
-
[2人のプレイヤーが交代で]stream[将棋を打つ]([1人は]
X、[もう1人は]Oを使用) -
[プレイヤーが一直線に並んでいるかどうかを判定する]([横]、[縦]、[斜め])
-
2次元配列:[行優先の格納]、[宣言方法] type array[名][[行]][[列]]
-
[ネスト] forループ[反復処理] 2次元配列
-
多次元配列[主な用途]:[行列]、[表]、[画像]
-
2次元配列[関数の引数として使用する場合は、列数を指定する必要がある]
-
[不規則]2次元配列[利用可能]ポインタ配列[実装]
8. 🚀 次は
[習得した]多次元配列、[次は] C [スタイルの]文字列([第]18[回])―― [文字]配列[を用いて]文字列を表現し、C++の文字列[の内部仕組み]を理解する。



