• ベストアンサー

関数に引数として配列を渡す方法

mainからtest関数にクラスAの中の ch[2][4]を渡したいのですが *hiki[1][1] = 'A';がコンパイルに通りません。 やり方が違うのでしょうか? class A{ char ch[2][4]; }; void test(char *hiki){ *hiki[1][1] = 'A'; } int main(){ A ob1; test(&ob1.ch[0][0]); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

void test(A *hiki){ hiki->ch[1][1] = 'A'; } int main(){ A ob1; test(&ob1); return 0; } ではどうでしょう? なお、元のプログラムでは、testに渡されたhikiは、単なるcharへのポインタで、hiki[1]やhiki[3]などと記述するのは可能ですが、hiki[0][1]や*hiki[0]や*hiki[1][1]などとは記述出来ません。 何故なら、test関数の中では、2次元配列の1次目の要素数が判らないので、実際のアドレスが計算出来ないのです。 例えば「30人を、前から順に何列か、1列の中は右から順に、出席番号順に四角く並べました。前から2列目の、右から2番目の人の人の出席番号は何番ですか?」と聞かれても、答えるのは不可能です。何故なら、1列が3人なのか、5人なのか、6人なのか、10人なのか、15人なのか判らないからです。 「charへのポインタだけ渡す」って事は、上記の例で言えば「先頭はこの人です。全体で何列なのか、1列が何人なのかは判りません」って言うのと同じです。「前から何列目の右から何人目」って言われても、1列の人数が判らないので、どうしようもありません。

jetblue
質問者

お礼

ありがとうございました。 二次元配列の仕組みがわかりました。 ありがとうございました。 また、他の回答をしてくださった方も ありがとうございました。

その他の回答 (2)

  • ryumei
  • ベストアンサー率60% (3/5)
回答No.3

根本的な回答にはなっていませんが、参考までに。 折角クラスを使うのですからC++らしくやってみてはいかがでしょう。 ※以下の例は初期化やセキュリティ性は中途半端にしか(むしろ殆ど)考慮してませんが^^; #define MAX_X 2 #define MAX_Y 4 class A{ public: // 任意の箇所に任意の文字を入れる void setChar(int x,int y,char pChr); private: // 2次元配列の本体 char ch[MAX_X][MAX_Y]; }; void main(){ A obj; // 実体の生成 obj.setChar(0,0,'A'); // 2次元配列の最初に'A'を代入 } void A::setChar(int x,int y,char pChr) { ch[x][y] = pChr; // 本体にセットする } ※配列を引数にする際にはNo.2氏がおっしゃるように注意が必要です。 配列の先頭アドレスだけを受け渡すことになるので、渡された関数側ではどのような配列なのかがわからず、2次元以上の配列操作は不可能なのです。 (多次元配列もメモリー上の見た目では順番に並んでるだけなのです)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★引数の宣言を変えるのが一番簡単ですよ。 void test( char hiki[2][4] ) ←ここがポイント {  hiki[ 1 ][ 1 ] = 'A'; ←『*』は必要ありません。 } int main() {  A ob1;    test( &ob1.ch[0][0] ); ←『ob1.ch』でも可能。  return( 0 ); } ・短いですがこれで終わりです。