• ベストアンサー

多次元配列の引渡しについて

encyの回答

  • ency
  • ベストアンサー率39% (93/238)
回答No.5

配列=ポインタという理解は間違いです。 配列はコンパイラによって「先頭要素を指すポインタ」に読み替えられるんです。 つまり、 int hoge[30]; と定義した場合、メモリ上には int型 30個分の領域が確保されることになりますが、式の中で「hoge」と使った場合には、&hoge[0] と等価、つまり配列 hoge の先頭要素 hoge[0] を指すポインタとして扱われるわけです。 # ですので、BLUEPIXYさんの No2 での以下の回答は、はずしていると思うん # ですが…(??) # # > 配列名は、ポインタではなくアドレス定数です。 # # もっと細かいことを言えば、配列名は左辺値として使用できない # (値を代入できない) とか、通常のポインタが間接参照なのに対して # 配列名は直接参照であるとか、いろいろあるんで面倒くさいんですけど、 # 要するに「ポインタ」ですよね。。。 int hoge[30]; ⇒ hoge は &hoge[0] に読み替えられる。  このとき読み替えられる型は int を指すポインタ (int *型) という基本がわかっていれば、あとは同じことです。 int piyo[10][20][30]; ⇒ piyo は &piyo[0][0][0] に読み替えられる。  このとき読み替えられる型は「『intの配列(要素数30)』の配列(要素数20)」を指すポインタ (int (*)[20][30]型) となります。 # どうしてこのようになるのか、ご自分でじっくりと考えてみてください。 ちなみに、「配列」→「ポインタ」の読替えは再帰的には行われません。 ですので、「配列の配列」→「配列を指すポインタ」にはなりますが、そこからさらに「ポインタを指すポインタ」にはなりません。 さて、前置きが少々長くなりましたが、関数の引数の配列を渡す場合には、必ずポインタに読み替えられた形で渡ることになります。 int hoge[30]; を関数 func1 の引数として渡したい場合、たとえば 「func1( hoge );」のようにコールしたい場合には、 void func1( int *p_hoge ); という型の関数を用意する必要があります。 同様に int piyo[10][20][30]; を関数 func2 に渡したい場合、たとえば「func2( piyo )」のようにコールしたい場合には、 void func2( int (*p_piyo)[20][30] ); という型の関数を用意してあげる必要があります。 なお、関数の仮引数に限り、ポインタ表記と配列表記は同じ意味を持ちます。 # 正直、こんな面倒な仕様があるために、配列とポインタに関する誤解が広まっている # 気がしなくもないんですけどね。。。 つまり、上記 func1() と func2() は以下のように書いてもまったく同じ意味になります。 〔func1() の定義〕 (1) void func1( int hoge_array[] ); (2) void func1( int hoge_array[30] ); /* (2) の場合、配列要素数 30 は無視されます */ 〔func2() の定義〕 (1) void func2( int piyo_array[][20][30] ); (2) void func2( int piyo_array[10][20][30] ); /* (2) の場合、配列要素数 10 は無視されます */ 通常は、配列の定義・宣言いずれもポインタの定義・宣言と異なりますので、ご注意ください。 # int hoge[30]; # # と # # int *hoge; # # が違うことは、改めて申し上げる必要もありませんよね? 細かい処理の話は、BLUEPIXYさんにお任せします。 # あ…肝心なところ逃げた (?) とりあえず、ご参考まで。。。

donntakosu
質問者

補足

とてもご親切な回答なのに 読んで分かりそうで分からず 混乱してくる自分が情けないです(苦笑)しかし ありがとうございます! ええと、BLUEPIXYさんの書いてくださった通りにやってみたら ついに 値がきちんと 引き渡されたように見えたのですが、 三次元の配列を引き渡したい場合、 int piyo[10][20][30] は、func(&piyo[0][0][0],sizeof(piyo)/size(double))でコールしたいとする時、 void func(int *ppiyo, int size)-(1) ではダメなのですか? それと、void func2( int (*p_piyo)[20][30] ); と書くのと (1)式 との違いはどのようなことなのでしょう?また、(*p_piyo)[20][30] とは、どんな意味をもち、プログラム中で、数値を代入させたりする 計算式中では どのように用いればよいのでしょう? 通常通り for(i=0;i<n;i++){ for(j=0;j<n;j++){ for(k=0;k<n;k++){ (*p_piyo)[20][30]=1; } } }などとつかうのでしょうか?違いますよね(^^ゞ 質問攻めですみません・・・

関連するQ&A

  • 2次元配列

    2次元配列は宣言して生成しますが配列名が異なる配列を例えば100個用意するにはいちいち宣言していたらすごいプログラム量になるので何かいい方法はないでしょうか?付け足しで指定した個数(例えば100個)分名前の異なる2次元配列を生成するには? java初心者なのでサンプルプログラムがあるとありがたいです。よろしくお願いします。

  • 多次元の配列を[ ]で括って見やすくトレースするには?

    多次元の配列を[ ]で括って見やすくトレースするには? 何次元か特定される配列ならばforなどで次元の数だけ繰り返せばできるとは思うのですが そうでないときにも [ [ [a,b,c,...],[],[],...],[],[],... ] のように隣り合う要素(配列)との切れ目が見やすいようにトレースする方法はありますか? プログラムには影響しませんが、トレースすると1次元の配列と同じように , だけで区切られてトレースされてしまい見にくいですので 配列が何次元か返させる関数など書ければ良いと思うのですが FlashPlayer10、ActionScript3.0です 質問の意味理解していただけるでしょうか お願いします

    • ベストアンサー
    • Flash
  • 二次元配列が、勝手に一次元配列になってしまう

    Excelのマクロで、二次元配列を格納したバリアント型を戻り値とする関数を作ったのですが、… 二次元型配列のひとつの要素数が1の時、受け取ったバリアント型変数は、一次元配列になっています。 列ベクトルなら、それもありかな~と思うのですが、なんで、行ベクトルまで、一次元配列にするんだよ~って、困っています。 シートから関数を呼んだ場合は、列ベクトルは列ベクトル、行ベクトルは行ベクトルとして、表示されるので、マクロの中で関数を呼び出した場合も、行列の情報を保持できる方法があるんじゃないかと思ったのですが。 どなたか、ご教示頂けるとありがたいです。 よろしくお願いします。

  • 多次元配列なんですが・・・

    初心者です。多次元配列をつかって縦の一列目と横の一列目だけに要素を表示さてたいのですが、どのようなプログラムを組んだらいいのでしょうか。友達に「triMatrix」というのを使ったらどうかといわれたのですが、いまいち分かりませんどなたか助言をお願いします。

  • 2次元配列でエラーがでます。

    VC++を使ってプログラムを書いています。2次元配列で配列を大きくするとエラーが出てしまいます。1次元配列の場合は今のところ特にエラーは出ない感じです。プログラムにもよりますが、小さい配列でa[300][300]くらいでエラーが出てしまいます。だいたい配列をa[10000][10000]くらい取りたいのですが。このエラーを解消する方法はないでしょう?

  • 二次元配列について

    高校の課題研究で、タイピングソフトを作ることになったのですが 二次元配列で、配列内の文字列をランダムで一つ表示するものを作りたいのですが 全然分かりません^^; プログラムを教えてくださる方いらっしゃいましたら 教えて貰えますとありがたいです><

    • ベストアンサー
    • Java
  • 2次元配列の配列

    VisualBasic.NETでプログラムを作っているのですが、2次元配列の配列で行き詰って困っています。 配列1~3を別に定義して、その2次元配列を配列Xという配列にひとまとめにしたいのですが、エラーが出てしまいます。 エラー内容は「配列初期化子の次元が少なすぎます」で、場所は配列Xの第1要素です。 配列1~3以降もどんどん配列を追加していく予定なので、なるべく以下の方法で書いていきたいのですが、解決法はないでしょうか? また、他にいい方法があればご教授ください。 ソースです。 ---------------------------------------- Public 配列1(,) As Integer = _ { _ {1, 1, 1}, _ {1, 1, 1}, _ {1, 1, 1}, _ {1, 1, 1} _ } Public 配列2(,) As Integer = _ { _ {2, 2, 2}, _ {2, 2, 2}, _ {2, 2, 2}, _ {2, 2, 2} _ } Public 配列3(,) As Integer = _ { _ {3, 3, 3}, _ {3, 3, 3}, _ {3, 3, 3}, _ {3, 3, 3} _ } Public 配列X(,)() As Integer = { _ 配列1, _     ←ここにエラーが出る 配列2, _ 配列3 _ } ---------------------------------------- 回答よろしくお願いします。

  • 2次元配列を多次元配列にする。

    2次元配列を多次元配列にする。 PHP5で 2次元目はすべて同じキーの2次元配列を 2次元目のキーごとの内容を共通項にまとめて、 多次元配列にする方法を教えてください。 キーの数は膨大なので、関数の再帰呼び出し で、きれいに処理したいのです。 説明文では説明しきれないので、 やりたいことは↓の通りです。 array[0] = array([one] => "あ", [twe] => "う" [three] => "き"); array[1] = array([one] => "あ", [twe] => "う" [three] => "く"); array[2] = array([one] => "あ", [twe] => "え" [three] => "け"); array[3] = array([one] => "あ", [twe] => "え" [three] => "こ"); array[4] = array([one] => "い", [twe] => "お" [three] => "さ"); array[5] = array([one] => "い", [twe] => "お" [three] => "し"); array[6] = array([one] => "い", [twe] => "か" [three] => "す"); array[7] = array([one] => "い", [twe] => "か" [three] => "せ"); という配列があったら、これを↓のようにしたいです。 array( [あ] => array( [う] => array ("き", "く") [え] => array ("け", "こ") ) [い] => array( [お] => array ("さ", "し") [か] => array ("す", "せ") )   ) どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 多次元配列の一次元目の最大値の求め方

    多次元配列の一次元目の最大値の求め方 下記のような多次元配列(ちなみに、これって二次元配列ですか?)があるとき、 常に、「一次元目の最大値+1」を返すようにしたいのですが、 どうすればよいのでしょうか? $data[0][0]とか$data[1][0]とか$data[2][0]とかの最大値の意味です。 下記の例でいくと、一次元目の最大値が3なので、数値の4を返したいのですが…、 ■$data 1,0,A1,B1,C1 2,5,A2,B2,C2 3,0,A3,B3,C3 3,2,A4,B4,C4

    • ベストアンサー
    • PHP
  • 3次元配列から2次元配列への代入

    C言語初心者です。 詳しい方、宜しくお願い致します。 下記のような三次元配列(Sanjigen[2][5][5])があります。 ダンプしたもので見難くてすみません。 00FFBCBC [0][0][0] 01 02 03 04 05 00FFBCC1 [0][1][0] 06 07 08 09 10 00FFBCC6 [0][2][0] 11 12 13 14 15 00FFBCCB [0][3][0] 16 17 18 19 20 00FFBCD0 [0][4][0] 21 22 23 24 25 00FFBCE4 [1][0][0] 26 27 28 29 30 00FFBCE9 [1][1][0] 31 32 33 34 35 00FFBCEE [1][2][0] 36 37 38 39 40 00FFBCF3 [1][3][0] 41 42 43 44 45 00FFBCF8 [1][4][0] 46 47 48 49 50 このデータ(Sanjigen[2][5][5])を、二次元配列にしまう方法をご教授ください。 Nijigen1[5][5]には三次元配列のデータ(1~25)と(26~50)をアンドしたデータを格納します。 Nijigen2[5][5]には三次元配列のデータ(1~25)と(26~50)をオアしたデータを格納します。 下記は自分の作ったプログラムですが、うまくいきません。 char Sanjigen[2][5][5]; char Nijigen1[5][5]; char Nijigen2[5][5]; void get_data( void ) { char i; for( i=0; i<8; ++i ){ Nijigen1[i] = Sanjigen[0][i] & Sanjigen[1][i]; Nijigen2[i] = Sanjigen[0][i] ^ Sanjigen[1][i]; } } 説明わかりにくくて申し訳ありません。 宜しくお願い致します。