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日目182521
2日目192722
3日目172420

配列の格納イメージ

行が日付、列が時間帯を表しています。

行の要素数は省略できる

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日目182521
2日目192822
3日目172420

要素を参照する例

配列の値を取り出して表示することもできます。

printf("%d\n", temperature[2][0]);

これは

3日目の朝の気温

を表示します。

出力例

17

2次元配列を使ったシンプルなプログラム例

次は、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次元配列は、表形式のデータを扱うプログラムではとても重要な技術です。実際の開発でも、データ管理やゲームのマップ処理、画像データなどで頻繁に使われます。配列の初期化と添字の使い方をしっかり理解しておくと、より複雑なプログラムでもスムーズに扱えるようになります。