多次元配列

二次元配列

配列は、同じデータ型の変数をまとめて扱うことができる機能です。
これだけでも便利なものですが、扱うデータによっては二次元配列を使ったほうがよりわかりやすくデータを扱うことができます。

例えば、以下のような表のデータを扱う場合を考えます。


英語 国語 数学
A君 60 75 82
B君 78 70 80
C君 80 64 68

これを配列だけで扱おうとすると、以下ようになります。

    int person1[] = { 60, 75, 82 };
    int person2[] = { 78, 70, 80 };
    int person3[] = { 80, 64, 68 };

これはまだわかりやすいですが、生徒数が増えるとその分だけ配列を増やさねばなりません。

あるいは、全てをひとまとめにしてしまいます。

int seiseki[] = { 60, 75, 82, 78, 70, 80, 80, 64, 68 };

これでは生徒数も教科数もわかりません。
どこでデータが区切られるかが分からず、バグが発生する可能性が高くなります。

こういった表のデータは二次元配列を用いるべきです。

int seiseki[3][3] = {
    { 60, 75, 82 },
    { 78, 70, 80 },
    { 80, 64, 68 }
};

二次元配列は変数名の後に角括弧を二つ続けて書くことで宣言します。
その中には扱いたいデータ数を書きます。

二次元配列の各要素は、以下のように対応します。

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

例えば、二人目の生徒の一教科目の成績データの値を参照したい場合は、

int seiseki[3][3] = {
    { 60, 75, 82 },
    { 78, 70, 80 },
    { 80, 64, 68 }
};

int tensuu = seiseki[1][0];

と記述します。
変数tensuuには78が代入されます。

二次元配列の初期化

上のサンプルコードでは、二次元配列の宣言と初期化を同時に行っています。
このような場合、最初の要素数は省略できます。

int seiseki[3][3] = {
    { 60, 75, 82 },
    { 78, 70, 80 },
    { 80, 64, 68 }
};

//↓最初の要素数は省略可

int seiseki2[][3] = {
    { 60, 75, 82 },
    { 78, 70, 80 },
    { 80, 64, 68 }
};

配列の宣言で指定した要素数に対して初期化子の数が足りない場合、足りない分は0で初期化されます。

int seiseki[3][3] = {
    { 60, 75, 82 },
    { 78, 70, 80 }
};

//↓以下と同じ意味

int seiseki2[3][3] = {
    { 60, 75, 82 },
    { 78, 70, 80 },
    { 0, 0, 0 }
};

// - - - - - - - - 

int array[2][4] = {};

//↓以下と同じ意味

int array[2][4] = {
    { 0, 0, 0, 0 },
    { 0, 0, 0, 0 }
};

また、このような初期化もできます。

int array[3][3] = {
    10, 20, 30, 40
};

//↓以下と同じ意味

int array2[3][3] = {
    { 10, 20, 30 },
    { 40, 0, 0 },
    { 0, 0, 0 }
};

二次元配列に一次元配列の初期化子を与えていますが、自動的に先頭から順に埋められ初期化されます。

多次元配列

通常の配列(一次元配列)は、縦あるいは横方向に連続したデータの並びを持つ変数の集合と考えることができます。
二次元配列は、表データのように縦横方向にそれぞれデータを持つ変数の集合と考えることができます。
二次元配列のような配列を多次元配列といいます。

配列の次元数はいくらでも増やすことができます。
しかし、大抵のデータは二次元配列で足り、たまに三次元配列が使われるくらいです。
四次元以上はほとんど使われず、データを分割するなどした方がわかりやすいことが多いでしょう。
(もちろん四次元配列を使用したほうが良いケースもあります)

//三次元配列
int array3[2][3][4] = {
    {
        { 1, 2, 3, 4 },
        { 5, 6, 7, 8 },
        { 9, 10, 11, 12 }
    },
    {
        { 13, 14, 15, 16 },
        { 17, 18, 19, 20 },
        { 21, 22, 23, 24 }
    }        
};

三次元配列はこのようなイメージです。
三次元配列のイメージ