多次元配列の動的確保

やや、どーもどーも、ふくともです。

今回は宣言通り多次元配列の動的確保についてまとめますです。

 

・そもそも多次元配列って何ぞ?

正直うまい例が思いつかないんだけど、

複数の軸を持つ座標ってところかな

一次元配列はX座標だけで

二次元配列はX座標、Y座標で

三次元配列はX座標、Y座標、Z座標で、という風に表現されるの。

二次元配列ならint array[y][x];

三次元配列ならint aray[z][y][x];

って感じで、型 配列名の後に各次元の要素数を書いていく。

 

(使用可能な)全体の要素数は各次元の要素数の積になってて

int array[3][3][3];

って宣言すると3*3*3で全部で27要素で

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

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

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

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

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

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

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

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

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

が使用可能

 

配列の掛け算になってる、くらいの理解でだいたいOK

素数は各次元で違っても問題なくて int array[3][5]; みたいな宣言も問題無いよ

 

で、その多次元配列(説明を簡略化するために二次元配列)の動的確保は前回を元にすると

int *array = new int[y][x];

と書きたくなるんだけどこれは間違い。

 

多次元配列は配列の配列なんです。

前回の記事を参照してもらえれば分かるかと思いますが、int * はint型配列を示すから配列の配列は示せないのです。

 

じゃあ、どうするかというとint  *が int型配列を示すのでint型配列の配列は

int **array = new int[y][x];

 

......惜しい。

newは指定された要素数配列を確保するためのものだからこれも間違い

でも配列の配列もint型の配列の配列 (だんだんわけがわからなくなってきたかな?)

「int型の配列」型の配列として考えると

int **array = new int*[y];

for(int i=0; i<x; ++I)

    *array[i] = new int[x];

と書くことで解決できる。

 

これは

「int型の配列」型の配列を動的に確保する

→その要素(つまりint型の配列)をそれぞれ動的に確保する

という仕組みになっているわけです。

 

三次元配列なら

int ***array = new int**[z];

for(int i=0; i<y; ++i){

    **array[i] = new int*[y];

    for(int j=0; j<x; ++j)

        *array[i][j]  = new int[x];

}

と入れ子にしてあげれば大丈夫。

 

delete[ ]は内側(とここでは表現する。 宣言時の右側の次元)から順に行う

for(int i=0; i<x; ++i)

    delete[ ] array[i];

delete[ ] array;

三次元以上の配列も同様に、適宜delete[ ]を入れ子にしてあげてくださいな。

 

前に書こうって言ってから一週間くらい経ってしまったけど一応こんな感じです。

前回致命的な記述ミスがあったことをもう一度お詫びします、申し訳ございませんでした。

今回も何かミス等があれば報告していただけると助かります。

報告は記事へのコメントでも構いませんし、下記のいずれかでも大丈夫です。

http://ask.fm/kata_tsuki

https://twitter.com/kata_tsuki

katatsuki52☆gmail.com (☆は@(半角)に置き換えてください)

2014/12/20 Sat.