• 締切済み

2次元配列の動的確保について、アドバイス下さい

今、大容量の2次元配列を造りたいので、 メモリの動的確保の勉強をしてました。 昔は、サイズ分mallocで確保して、配列の各行の先頭アドレスを それぞれ対応させていって、行列としてポインタを扱えるようにしてたのですが、 調べていると、もっと簡単に2次元配列のメモリを確保できるみたいなので、その方法を調べていました。 その中で、 if(!(ptr = (int (*)[RETSU])calloc(GYOU*RETSU, sizeof(int)))) こういう例題を見つけたんですけど、 これの、(*)[RETSU])のところが、理解できません。 これは何をしているのでしょうか? どういう言葉で検索すれば、説明が出てくるのか解らなかったので質問させて頂きました。 この(*)[RETSU]の感じの書き方をすると、結構簡単にメモリ確保できるみたいなので、解説、または説明サイトなど教えて頂けると助かります。 または、例題を書いていただけるとスゴク助かります。 ちなみに私が造りたいのは、 100行300000列 ほどの配列です。 是非、よろしくお願いします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

int array[GYOU][RETSU]; という配列の, array (をポインタに変換したもの) の型が int (*)[RETSU] です. だから, よくわからないかもしれないですが実はただのキャスト. とはいえ, このキャストに意味があるとは思えず....

pen123
質問者

お礼

回答ありがとうございます。 こんな書き方があるんですね。 勉強になりました!

  • isle
  • ベストアンサー率51% (77/150)
回答No.1

それは型を表しています。 『int (*)[RETSU]』で一揃いです。 int foo[GYOU][RETSU]; と宣言したときのfoo[n]のことです。 簡単にメモリ確保できるのではなくて、 foo[n][m]と書けるので見やすいということです。 int *ptr; ptr = (int *)calloc(GYOU*RETSU, sizeof(int)); というときは ptr[n*RETSU+m]としなければならないですから。

pen123
質問者

お礼

ありがとうございます。 少し意味が解ってきました。 もう少し調べてみたいと思います!