多次元配列は、メモリ上にどのように並んでいるのでしょうか? どんな順番で初期化されるのでしょうか? 今回は、そういうお話です。
では、今回の要点です。
では、いってみましょう。
さて、「配列変数の名前は、その配列の先頭のアドレスになる」と、第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つの要素からなる配列なわけです。
言葉で説明すると何とも分かりにくいので、下の図を見て下さい。
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番目以降の要素数を省略できないのは仕様です。これはもう、仕方がないです。我慢しましょう。
それでは、今回のまとめです。
それでは、次回まで。
Last update was done on 2000.7.26
この講座の著作権はロベールが保有しています