C言語の配列を学習すると、次に登場するのが2次元配列です。1次元の配列が「一列に並んだリスト」だとすれば、2次元配列は**「縦横に広がる表(テーブル)やグリッド」**とイメージすると分かりやすいでしょう。
エクセルのシートや、ゲームのマップ、座席表など、身の回りにある多くのデータは、この2次元の表形式で表現できます。この記事では、2次元配列の基本的な作り方と使い方を、初心者にも分かりやすく解説します。
2次元配列の作り方(宣言と初期化)
2次元配列は、**「配列の配列」**として定義されます。
基本構文: データ型 配列名[行数][列数];
- 行数 (Rows): 配列の縦方向の長さ
- 列数 (Columns): 配列の横方向の長さ
例えば、3人の生徒の、4科目分のテストの点数を格納する表は、次のように宣言できます。
// 3行 x 4列 の整数型2次元配列
int student_scores[3][4];
宣言と同時に初期値を設定する場合は、{}
を入れ子にして記述します。
int student_scores[3][4] = {
{82, 75, 90, 88}, // 1人目の生徒の点数 (0行目)
{95, 88, 85, 92}, // 2人目の生徒の点数 (1行目)
{76, 81, 79, 85} // 3人目の生徒の点数 (2行目)
};
2次元配列の要素へのアクセス
2次元配列の特定の要素にアクセスするには、行と列、2つのインデックス(添え字)を指定します。インデックスは0
から始まることに注意してください。
配列名[行のインデックス][列のインデックス]
例えば、student_scores
配列から「2人目の生徒(1行目)の、3科目目の点数(2列目)」を取得するには、以下のように書きます。
int score = student_scores[1][2]; // 85 が取得される
同様に、値を代入することもできます。
C
// 3人目の生徒(2行目)の、4科目目の点数(3列目)を100点に更新
student_scores[2][3] = 100;
2次元配列の全ての要素を操作する(繰り返し処理)
2次元配列の全ての要素を順番に処理するには、for
文を2重にした入れ子(ネスト)ループを使うのが一般的です。
- 外側のループで行を制御する
- 内側のループで列を制御する
サンプルコード
先ほどの生徒の点数データを、表形式で綺麗に出力するプログラムを見てみましょう。
#include <stdio.h>
int main(void) {
int student_scores[3][4] = {
{82, 75, 90, 88},
{95, 88, 85, 92},
{76, 81, 79, 85}
};
// 外側のループ (jが行を0→1→2と変化)
for (int j = 0; j < 3; j++) {
printf("生徒%d: ", j + 1);
// 内側のループ (iが列を0→1→2→3と変化)
for (int i = 0; i < 4; i++) {
// %4d で、4桁分の幅を確保して右詰めで表示
printf("%4d", student_scores[j][i]);
}
printf("\n"); // 1行分の表示が終わったら改行
}
return 0;
}
実行結果:
生徒1: 82 75 90 88
生徒2: 95 88 85 92
生徒3: 76 81 79 85
このように、入れ子ループを使うことで、2次元配列のデータを体系的に扱うことができます。
3次元以上の配列について
C言語では、3次元、4次元…と、さらに次元の多い配列(多次元配列)を作ることも可能です。
3次元配列の宣言: データ型 配列名[奥行き][行数][列数];
3次元配列は「表の集まり」や「立方体」のイメージです。例えば、school_data[クラス数][生徒数][科目数]
のように使えます。
ただし、3次元以上になるとプログラムが複雑になり、管理が難しくなるため、実際のプログラミングでは構造体を使うなど、他の方法が選ばれることも多くあります。
まとめ
- 2次元配列は、**表(テーブル)**形式のデータを扱うのに非常に便利。
配列名[行数][列数]
のように宣言し、配列名[行インデックス][列インデックス]
で要素にアクセスする。- 全ての要素を処理するには、入れ子になった
for
ループを使うのが定石。
2次元配列を使いこなせると、C言語で扱えるデータの幅がぐっと広がります。まずは簡単な表を作成し、データを表示するプログラムから試してみてください。