第62章 多次元配列2

 多次元配列は、メモリ上にどのように並んでいるのでしょうか? どんな順番で初期化されるのでしょうか? 今回は、そういうお話です。


 では、今回の要点です。


 では、いってみましょう。


 さて、「配列変数の名前は、その配列の先頭のアドレスになる」と、第35章で言いました。

 この「配列変数の名前」というのは、「[ ] をのけたもの」と考えることもできます。では、多次元配列で [ ] をのけたものはどうなるのでしょうか? 例えば、int array[3][5]; としたとき、array[1] はどうなるのでしょうか?

 実は、これはきちんと機能します。機能するということは、これもやはり何かの配列の先頭アドレスになっているはずです。これは array[0] 〜 array[2] まであり、結局 array は配列の配列であることが分かると思います

 このように、多次元配列は、何て事はない、配列を配列にしているだけなのです。

 予想できるように、array[0] は array[0][0] 〜 array[0][4] という配列の先頭アドレス &array[0][0] になります。つまり、int array[3][5] というのは、int 型5個の要素からなる配列を1つの要素とする、3つの要素からなる配列なわけです。

 言葉で説明すると何とも分かりにくいので、下の図を見て下さい。

int array[3][5];

 array[0] を int 型5個の要素からなる配列 array_0 と、array[1] を int 型5個の要素からなる配列 array_1 と、array[2] を int 型5個の要素からなる配列 array_2 と見なすと、array は array_0, array_1, array_2 の3つの要素からなる配列ということになります。

 同じように、3次元配列は2次元配列の配列、4次元配列は3次元配列の配列、という風になっています。


 で、メモリにはこの通りの順番で、隙間無く並んでいます。array[0][0] が一番はじめにあり、次に array[0][1] が、その次には array[0][2] があります。そして、array[0][4] の次は array[1][0] になります。このように、array[2][4] まで、順番に並んでいます。

 番号だけを書くと、(0, 0), (0, 1), (0, 2), ..., (1, 0), (1, 1), ... という風になります。感覚的にもよく分かる順番になっていると思います。3次元だと、(0, 0, 0), (0, 0, 1), (0, 0, 2), ..., (0, 1, 0), (0, 1, 1), ..., (1, 0, 0), (1, 0, 1), ..., (1, 1, 0), (1, 1, 1), ... という順番になります。

 初期化も、この順番で行います。

int array[3][5] = {
    {  1,  2,  3,  4,  5, },
    {  2,  4,  6,  8, 10, },
    {  3,  6,  9, 12, 15, },
};

 配列の配列ということで、初期化の書き方も、配列の配列と言わんばかりになっています。一応は { } なしでも動作に問題はないのですが、{ } をつけておく方が安心です。3次元、4次元も、同じような考えで初期化できます。

 また、配列の初期化の際には、普通は配列のサイズは書かないようにするものです。多次元配列ではどうなのでしょうか?

int array[][] = {
    {  1,  2,  3,  4,  5, },
    {  2,  4,  6,  8, 10, },
    {  3,  6,  9, 12, 15, },
};

 これだと、エラーが出てしまいますね...。では、これでどうでしょうか?

int array[][5] = {
    {  1,  2,  3,  4,  5, },
    {  2,  4,  6,  8, 10, },
    {  3,  6,  9, 12, 15, },
};

 これで、エラーはでないようです。要素を増やすときは

int array[][5] = {
    {  1,  2,  3,  4,  5, },
    {  2,  4,  6,  8, 10, },
    {  3,  6,  9, 12, 15, },
    {  4,  8, 12, 16, 20, },
};

という風にするので、一番最初の要素数を省略するのもうなずける話ですね。

 2番目以降の要素数を省略できないのは仕様です。これはもう、仕方がないです。我慢しましょう。


 それでは、今回のまとめです。


 それでは、次回まで。


第61章 多次元配列 | 第63章 参照するな

Last update was done on 2000.7.26

この講座の著作権はロベールが保有しています