C言語のきほん|多次元配列の使い方

表のようにデータを扱おう!C言語で理解する多次元配列の基本

配列は、同じ型のデータをまとめて管理するための便利な仕組みです。これまで学んできた1次元配列は、一直線に並んだデータを扱うためのものでした。たとえばテストの点数を並べたり、センサーの値を順番に保存したりするような場合に使われます。

しかし実際のプログラムでは、行と列のような形でデータを管理したい場面がよくあります。
たとえば次のようなデータです。

  • 学生ごとの科目の点数
  • カレンダーのような表形式データ
  • ゲームのマップ
  • 画像データ(縦×横の画素)

このような「表のような構造」を扱うときに使われるのが 多次元配列 です。

1次元配列を「縦に並んだ箱の棚」と考えると、多次元配列は「縦にも横にも広がった棚」のようなものです。
特に最もよく使われるのが 2次元配列 で、行と列を持つデータ構造になります。

この章では、多次元配列の基本として次の内容を学んでいきます。

  • 2次元配列の宣言方法
  • 配列のメモリ上での並び方
  • 行と列を使ったデータの扱い方
  • 繰り返し処理での利用方法

少しだけ考え方が広がりますが、基本は1次元配列と同じです。ゆっくり整理しながら理解していきましょう。

多次元配列とは何か

多次元配列とは、複数の添字を使ってデータを管理する配列のことです。

1次元配列は次のように1つの添字でアクセスします。

data[0]
data[1]
data[2]

一方、2次元配列では 行と列の2つの添字を使います。

data[行][列]

例えば次のような形です。

行\列012
0data[0][0]data[0][1]data[0][2]
1data[1][0]data[1][1]data[1][2]

このように、表のセルを指定するようなイメージでデータにアクセスできます。

2次元配列の宣言

2次元配列を宣言する構文は次のようになります。

型名 配列名[行の要素数][列の要素数];

例えば、3人の学生の4回のテスト結果を保存する配列を作る場合は次のように書きます。

int scores[3][4];

この宣言の意味は次の通りです。

項目意味
3学生の人数
4テストの回数
scores点数を保存する配列

つまり次のような表を表現できます。

学生テスト1テスト2テスト3テスト4
学生0scores[0][0]scores[0][1]scores[0][2]scores[0][3]
学生1scores[1][0]scores[1][1]scores[1][2]scores[1][3]
学生2scores[2][0]scores[2][1]scores[2][2]scores[2][3]

このように、行と列の組み合わせでデータを管理できるのが2次元配列の特徴です。

2次元配列のイメージ

2次元配列は、表のような構造として理解すると分かりやすいです。

例えば

scores[1][2]

2人目の学生の3回目のテストを意味します。

メモリ上での配列の並び

2次元配列は表のように見えますが、実際のメモリ上ではすべて連続した領域に並んでいます

この並び方は 行優先(row major order) と呼ばれます。

そのため、次のように行を順番に処理するループがよく使われます。

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

次は、2人分の3日間の気温データを表示するプログラムです。
2次元配列を使って表形式のデータを管理しています。

ファイル名:10_7_1.c

#include <stdio.h>

int main(void)
{
    int temperature[2][3] = {
        {25, 27, 26},
        {24, 26, 28}
    };

    int i, j;

    printf("2日分の気温データを表示します\n");

    for (i = 0; i < 2; i++) {
        printf("%d日目の気温: ", i + 1);

        for (j = 0; j < 3; j++) {
            printf("%d ", temperature[i][j]);
        }

        printf("\n");
    }

    return 0;
}

プログラムのポイント

ポイント説明
temperature[2][3]2行3列の配列
外側のfor日数のループ
内側のfor時間ごとのデータ

このように、2次元配列ではループを2重にすることで簡単にデータを処理できます。

処理の流れは次のようになります。

1日目
 25 27 26

2日目
 24 26 28

2重ループと多次元配列

多次元配列を扱うときは、繰り返し処理を組み合わせることがとても重要です。

基本形は次の形になります。

for (行のループ)
{
    for (列のループ)
    {
        配列[行][列]を処理
    }
}

次のような動きになります。

行0 → 列0 列1 列2
行1 → 列0 列1 列2
行2 → 列0 列1 列2

このパターンを覚えておくと、次のようなプログラムが簡単に書けるようになります。

  • 表形式のデータ処理
  • ゲームのマップ管理
  • 行列計算
  • 画像処理

多次元配列はC言語の中でも実務でもよく使われる重要なデータ構造です。
1次元配列の延長として理解すれば難しくありませんので、実際にプログラムを書きながら少しずつ慣れていきましょう。