- ベストアンサー
多次元配列のポインタ渡し
C++を使用しています。 多次元配列を関数の引数として渡したいとき、関数側では void A::Func(int a[10][20][30])~ 呼びだし側では Finc(a); とやればいいのはわかります。 お聞きしたいのは、仮引数として呼び出された配列(上でいうa)をクラスのメンバ変数として保持したい場合の方法です。 aは先頭アドレスなのでそこを差すポインタを受ければいい、っていうことはわかりますが、 この方法ですと、受けたメンバ変数が配列みたいに[]を使ってアクセスできません。 (メンバ変数のポインタは配列じゃないから当然ですよね) これを通常の配列みたいに扱えるようにするにはどうしたらいいでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
class A { int (*p)[20][30]; public: void Func(int a[10][20][30) { p = a; } };
その他の回答 (2)
- smat7
- ベストアンサー率46% (7/15)
多次元の配列の場合、高次の添え字はその次元以下の配列要素数文のインクリメント量をあらわします。なので配列の先頭アドレスを渡しただけでは[]による参照ができません。これはそのポインタがどのような構成の配列であるかを関数プロトタイプ宣言時に明示することで解決できます。この時最低次元の要素数(例では10)は省略することはできますが、高次の要素数はコンパイル時に定数として固定されていなければなりません。これはaの要素を参照するために a[i][j][k] = *(a+(20*30*k+30*j+i))という計算をコンパイラがしなければならないからです
お礼
ありがとうございます。 参考になりました。
- ency
- ベストアンサー率39% (93/238)
実際に試してみましたか? No1 jactaさんの方法で A::p[i][j][k] として何も問題ありませんよ。 たとえば、 void func( int *p_hoge ) { // *(p_hoge + i) だけでなく p_hoge[i] とすることも可能 } というのは問題ありませんよね? 要するに、これと同じことです。
お礼
ありがとうございます。 その方法では1次元ではうまくいきますが、2次元以上では型変換に失敗し、コンパイルエラーとなりました。
お礼
ありがとうございます。 うまくできました。