プロが教える店舗&オフィスのセキュリティ対策術

C++を使用しています。

多次元配列を関数の引数として渡したいとき、関数側では
void A::Func(int a[10][20][30])~
呼びだし側では
Finc(a);
とやればいいのはわかります。

お聞きしたいのは、仮引数として呼び出された配列(上でいうa)をクラスのメンバ変数として保持したい場合の方法です。
aは先頭アドレスなのでそこを差すポインタを受ければいい、っていうことはわかりますが、
この方法ですと、受けたメンバ変数が配列みたいに[]を使ってアクセスできません。
(メンバ変数のポインタは配列じゃないから当然ですよね)
これを通常の配列みたいに扱えるようにするにはどうしたらいいでしょうか。

A 回答 (3件)

class A


{
 int (*p)[20][30];
public:
 void Func(int a[10][20][30)
 {
  p = a;
 }
};
    • good
    • 1
この回答へのお礼

ありがとうございます。
うまくできました。

お礼日時:2006/02/03 13:40

多次元の配列の場合、高次の添え字はその次元以下の配列要素数文のインクリメント量をあらわします。

なので配列の先頭アドレスを渡しただけでは[]による参照ができません。これはそのポインタがどのような構成の配列であるかを関数プロトタイプ宣言時に明示することで解決できます。この時最低次元の要素数(例では10)は省略することはできますが、高次の要素数はコンパイル時に定数として固定されていなければなりません。これはaの要素を参照するために a[i][j][k] = *(a+(20*30*k+30*j+i))という計算をコンパイラがしなければならないからです
    • good
    • 0
この回答へのお礼

ありがとうございます。
参考になりました。

お礼日時:2006/02/03 13:42

実際に試してみましたか?



No1 jactaさんの方法で

A::p[i][j][k]

として何も問題ありませんよ。

たとえば、

void func( int *p_hoge )
{
// *(p_hoge + i) だけでなく p_hoge[i] とすることも可能
}

というのは問題ありませんよね?

要するに、これと同じことです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
その方法では1次元ではうまくいきますが、2次元以上では型変換に失敗し、コンパイルエラーとなりました。

お礼日時:2006/02/03 13:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!