C言語

多次元配列の仕組み

前回、配列を一列のイメージで学びましたが、今回は、この配列を二次元以上に並んだイメージである多次元配列として指定する方法を学びます。

多元配列の使い方

多次元配列とは、二次元配列以上の配列を言います。
二次元配列は、一列の配列が、縦に積み重なったものです。
三次元配列は、3Dのように、X軸、Y軸、Z軸であらわされたものです。二次元配列に、奥行きを持たせたようなものです。

二次元配列と、三次元配列の構文は次のようになります。

構文

型名 変数名[ 要素数 ][ 要素数 ]      ←二次元配列

型名 変数名[ 要素数 ][ 要素数 ][ 要素数 ]  ←三次元配列

このように、配列の[ 要素数 ]が増えただけのものです。

int array[2][3] ;

このように宣言すると、配列が2 × 5 = 10個分を格納する配列になります。また、次のような変数が作られます。

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

イメージだとこんな感じでしょうか。

実際に、サンプルプログラムを動かして確認したほうが理解が早いかもしれませんね。
次に、サンプルプログラムを示します。

#include <stdio.h>

int main(void)
{
    int array[2][3];
    int i, j;

    array[0][0] = 1;
    array[0][1] = 2;
    array[0][2] = 3;
    array[1][0] = 10;
    array[1][1] = 20;
    array[1][2] = 30;

    for( i = 0; i < 2; i++ )
    {
        for( j = 0; j < 3; j++ )
        {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
    return 0;
}

for文の中にfor文があるパターンが初めて出てきました。このような同じ制御文が中にある構造のことをネストと呼びます。
最初のfor文では、i = 0 で、その次のfor文では、j = 0~2を繰り返し、printf関数で、array[0][0]~array[0][2]を表示させます。
そして、次のprintf関数で改行します。
最初のfor文に戻って、i = 1で、その次のfor文では、j = 0~2を繰り返し、printf関数で、array[1][0]~array[1][2]を表示させます。
最後にprintf関数で改行して処理を終了します。

サンプルプログラムの実行結果は、次のようになります。

実行結果

1 2 3
10 20 30

二次元配列で説明してきましたが、三次元配列でも同様の使い方と思って問題ないと思います。

多次元配列の初期化

前回の配列の初期化では、宣言時に { } で囲んで値を記述していました。多次元配列でもそれは同様ですが、少し異なるところがあります。
多次元配列では、{ } の中に、もう一度 { } を記述するかたちとなります。
二次元配列の初期化を次に示します。

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

また、前回の配列の初期化で、要素数を省略しましたが、多次元配列でも要素数を省略できます。
ただし、省略できるのは、最初(左側)の要素数のみとなります。

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

また、多次元配列の初期値の省略についても、前回の配列の初期化で紹介したように、省略できます。省略した場合は、0が代入されます。

以上が、多次元配列について学びました。

次は、 文字列の扱いについて学びます。

文字列の扱い

-C言語