
C言語のきほん|2次元配列を初期化して使う
表データをスマートに管理!C言語で学ぶ2次元配列の初期化と活用
これまでに学んだ配列は、一直線に並んだデータを扱う「1次元配列」でした。しかし、実際のプログラムでは、表のような形でデータを管理したい場面が多くあります。
例えば次のようなデータです。
- 学生ごとの教科の点数
- 月ごとの売上データ
- ゲームのマップ
- 画像のピクセル情報
このような 行と列を持つデータ構造 を扱うときに便利なのが 2次元配列 です。
2次元配列は「表(テーブル)」のようなイメージで理解すると分かりやすいです。
行と列の位置を指定することで、目的のデータを取り出したり変更したりできます。
この記事では次の内容について学んでいきます。
- 2次元配列の初期化方法
- 初期化時の書き方のルール
- 行と列の添字を使った要素の操作
- 実際のプログラムでの利用方法
少しだけ記述が増えますが、基本的な考え方は1次元配列と同じです。順番に見ていきましょう。
2次元配列を初期化する
2次元配列を宣言するとき、同時に値を設定することができます。
これを 初期化 と呼びます。
2次元配列では、行と列の関係を分かりやすくするために 二重の波括弧 を使って書くのが一般的です。
文法
型名 配列名[行の要素数][列の要素数]
= {{値, 値, 値, ...}, {値, 値, 値, ...}, ...};外側の波括弧は 配列全体 を表します。
内側の波括弧は 各行のデータ を表します。
例:3日間の気温データ
次の例では、3日間の朝・昼・夜の気温を2次元配列に初期化しています。
int temperature[3][3] = {
{18, 25, 21}, // 1日目
{19, 27, 22}, // 2日目
{17, 24, 20} // 3日目
};この配列の意味は次のようになります。
| 日付 | 朝 | 昼 | 夜 |
|---|---|---|---|
| 1日目 | 18 | 25 | 21 |
| 2日目 | 19 | 27 | 22 |
| 3日目 | 17 | 24 | 20 |
配列の格納イメージ

行が日付、列が時間帯を表しています。
行の要素数は省略できる
2次元配列では、初期化子がある場合に 先頭の要素数だけ省略することができます。
例えば次のように書くことができます。
int temperature[][3] = {
{18, 25, 21},
{19, 27, 22},
{17, 24, 20}
};この場合、コンパイラが初期化データの数を見て 行数を自動的に判断します。
つまり
temperature[3][3]と同じ意味になります。
すべての要素数を省略することはできない
次のような書き方は コンパイルエラーになります。
int temperature[][] = {
{18, 25, 21},
{19, 27, 22},
{17, 24, 20}
};これは、列数が分からないと メモリの配置が決められないためです。
省略できるルール
| 配列の種類 | 省略できる要素数 |
|---|---|
| 1次元配列 | 要素数を省略できる |
| 2次元配列 | 行数のみ省略できる |
| 3次元以上 | 先頭の要素数のみ省略できる |
このルールは多次元配列すべてに共通しています。
2次元配列の要素を利用する
2次元配列の要素を使うときは、行と列の2つの添字を指定します。
文法
配列名[行の添字][列の添字]添字は 0から始まる ことに注意してください。
例
temperature[0][0]これは
1日目の朝の気温
を意味します。
要素に値を代入する例
次の例では、2日目の昼の気温を変更しています。
temperature[1][1] = 28;表で見ると次の位置になります。
| 日付 | 朝 | 昼 | 夜 |
|---|---|---|---|
| 1日目 | 18 | 25 | 21 |
| 2日目 | 19 | 28 | 22 |
| 3日目 | 17 | 24 | 20 |
要素を参照する例
配列の値を取り出して表示することもできます。
printf("%d\n", temperature[2][0]);これは
3日目の朝の気温
を表示します。
出力例
172次元配列を使ったシンプルなプログラム例
次は、3日間の気温データを表示する簡単なプログラムです。
2次元配列のデータをループで順番に表示しています。
ファイル名:10_8_1.c
#include <stdio.h>
int main(void)
{
int temperature[3][3] = {
{18, 25, 21},
{19, 27, 22},
{17, 24, 20}
};
int day, time;
printf("3日間の気温データを表示します\n");
for (day = 0; day < 3; day++) {
printf("%d日目の気温: ", day + 1);
for (time = 0; time < 3; time++) {
printf("%d ", temperature[day][time]);
}
printf("\n");
}
return 0;
}プログラムの動作
出力例
3日間の気温データを表示します
1日目の気温: 18 25 21
2日目の気温: 19 27 22
3日目の気温: 17 24 20処理の流れ
このプログラムでは 2重のfor文 を使っています。
| ループ | 役割 |
|---|---|
| 外側のfor | 日付を順番に処理 |
| 内側のfor | 朝・昼・夜の気温を表示 |
イメージで表すと次のように処理されます。
1日目 → 朝 昼 夜
2日目 → 朝 昼 夜
3日目 → 朝 昼 夜このように 行を外側のループ、列を内側のループ にすると、2次元配列のデータを自然な順序で処理できます。
2次元配列は、表形式のデータを扱うプログラムではとても重要な技術です。実際の開発でも、データ管理やゲームのマップ処理、画像データなどで頻繁に使われます。配列の初期化と添字の使い方をしっかり理解しておくと、より複雑なプログラムでもスムーズに扱えるようになります。
