• ベストアンサー

多次元配列

たとえば  int test[]={1,2,3}; のような場合は、配列の要素数を省略できます。 しかし、多次元配列の場合は左端の添え字しか省略できないのはなざでしょうか? 例  int test[][3]={{1,2,3},{4,5,6},{7,8,9}}; 全部省略できない理由がわかりません。 どなたか教えてれませんか?

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

  • ベストアンサー
  • oldman50
  • ベストアンサー率29% (8/27)
回答No.2

 変数の宣言は、通常、  int hoge; のように「型 変数名;」の形をしています。しかしCやC++での配列の宣言  int test[3]; は「型 変数名;」の形をとっていません。  つまりCやC++での配列の宣言は、「型 変数名;」以外の規則に従っている訳で、CやC++で配列の宣言を見たら、その規則にしたがって何がどう宣言されているのかを、注意して良く考える必要があります。  int test[3]; は、testが、int型の配列(要素数3)だと宣言しています。  int test[3]={1,2,3}; という初期化つき宣言は、testが、int型の配列(要素数3)なので、 「0番目の要素test[0]はint型の1で、1番目の要素test[1]はint型の2で、2番目の要素test[2]はint型の3で初期化せよ」 とコンピュータに命令しています。  この命令を実行するには、右辺に並んだ3つの配列要素(int型の1,2,3)があればそれで充分なので、左辺の添字3は省略できるようにしたのです。  int test[]={1,2,3};  一方、  int test[2][3]; は、testが、「int型の配列(要素数3)」の配列(要素数2)だと宣言しています。  多次元配列というと、そういう型があるように思えてしまいますが、多次元配列というのは「配列の配列」のことをそう呼ぶようにしただけなので、実際はすべての多次元配列は、配列の(配列の配列の…)配列になります。このとき、  int test[2][3]={{1,2,3},{4,5,6}}; という初期化つき宣言は、testが、「int型の配列(要素数3)」の配列(要素数2)なので、 「0番目の要素test[0]は配列{1,2,3}で、1番目の要素test[1]は配列{4,5,6}で初期化せよ」 とコンピュータに命令しています。  この命令を実行するには、右辺に並んだ2つの配列要素(配列{1,2,3}と配列{4,5,6})があればそれで充分なので、左辺の1番目の添字2は省略できるようにしたのです。  int test[][3]={{1,2,3},{4,5,6}};  このとき、左辺の2番目の添字3は、test[0]、test[1]の各々に格納する配列の要素数(=3)をコンピュータに教えている訳です。  実は、この2番目の添字には、別の数字を設定することが出来ます。  たとえば、  int test[][4]={{1,2,3},{4,5,6}}; に変えたとすると、これは、  int test[][4]={{1,2,3,0},{4,5,6,0}}; と宣言したのと同じと解釈されます。  int aa[][4]={{10,20},{30,40,50}}; は、  int aa[][4]={{10,20,0,0},{30,40,50,0}}; と宣言したのと同じと解釈されます。  このように、2番目の数字の設定によって、宣言される配列の内容が変わってしまうので、2番目の添字は省略できない訳です。

szatmari
質問者

お礼

解答ありがとうございました。 よくわかりました。

その他の回答 (2)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

2次元以上の場合、「要素数」ではなくて、「型名」になるというのはみなさんおっしゃるとおりですね。 ならば、初期化子リストを見て、「型名」を決定してくれてもいいのに、という感じはしないでもないですね。 実際のところ、コンパイラの実装が難しいからじゃじゃいでしょうか? 今回は2次元なので、そう複雑でもないですが、3次元、4次元、5次元となった場合の処理が難しいので、「型名」の自動決定までは行わないと決めたというのも、ありそうな話かなと思います。

szatmari
質問者

お礼

解答ありがとうございました。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

>全部省略できない理由がわかりません。 これは 『int[3]』型の配列を宣言しており、その型名までは省略できないからです。 コンパイラは int[3] 型の要素がいくつ格納されているかは親切にも数えてくれますが、それ以上は面倒をみてくれません。 そもそも、配列に格納されている型(今の場合は int[3])のサイズがわからないと、要素数を数えることができません。

szatmari
質問者

お礼

解答ありがとうございました。

関連するQ&A

  • 配列の要素数を調べる方法

    配列の中にいくつ要素があるか後から調べる方法はあるでしょうか? int test[4][3] = {   {0,1,2},   {0,1,2},   {0,1,2},   {0,1,2}, } ; 上のケースだと、X方向に3、Y方向に4つの 要素があります。しかし、これだとあらかじめいくつ要素があるかを決めて 置かないといけません。 例えば、 int test[] = {0,1,2,3....} みたいに宣言された場合や、 char *test[] = {   "ああああああ",   "いいいいいい",   "うううううう",      ・      ・ //(これは文字列の数を要素数とします) } ; のように宣言された二次元配列などで、後から配列内にいくつ要素があるかを 調べることなどは可能でしょうか?

  • 二次元配列のインデックスについて

    基礎的な質問かもしれませんが、ネットで調べたのですが、うまく回答が見つからなかったので、教えて下さい。 VB.netで二次元配列を扱っているのですが、この要素はどこにあるのかを知りたいのです。 一次元配列でしたら、Indexof を使えば、どこのインデックスに配置されているかが分かると思うのですが、 二次元配列の場合は、どうすればインデックス数が分かるのでしょうか。 例えば、列は0で固定だけど、どこの行にこの要素が格納されているか分からないから、行番号を知りたいと言うときです。 よろしくお願いいたします。

  • 2次元配列について、教えてください。

    基本的なことなのでしょうがまだよくわかっていません。 ワークシートにたとえると、1次元は縦方向(行番号方向)、二次元は横方向(列番号方向)ですよね? 列数、行数にあたるのが1次元、二次元それぞれの添字ですよね? そしてセルに当たるのが「要素」ですよね? 以上の解釈があっていたら、 1.A列やB列にあたるものはなんと呼ぶのでしょうか? 2.1行目や2行目にあたるのはなんと呼びますか? 3.ワークシートで行や列を削除するような感じで2次元配列の行や列にあたるものを削除することはできますか? 4.UBound関数は、配列の大きさを調べられますが、この大きさは添字です。ワークシートのCells(65536,1).End(xlUp)Rowのように実際にデータがどこまで入っているか調べられますか? 教えてください。 前提とした解釈自体が違っていたらそれもご指摘ください。

  • 配列について

    2次元配列において a[][5] と、左側の要素数のみ省略できるのはなぜですか?

  • 二次元配列が、勝手に一次元配列になってしまう

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

  • 任意の要素数の二次元配列を渡したい

    関数で、各次元の要素を問わず、二次元配列を受け取りたいのですが、下記の方法では失敗しました (要素にアクセスすると落ちる) void func(void *p){ int **v=(int **)p } void func(int p[][3]) 上記のような、指定された数だけを受け取る方法をとるしかないのでしょうか ご存知の方が居ましたら教えてください

  • 2次元配列とじゃんけんアルゴリズムについて質問

    以下の、過去に私が質問した、2次元配列とじゃんけんアルゴリズムの質問のURLの見た上で私の質問に答えてください。 URL:ttp://okwave.jp/qa/q7038056.html 質問: public static int janken(int n){ int[][]tb1={ {9,9,9,9}, {9,0,1,2}, {9,2,0,1}, {9,1,2,0} }; int m=rand3(); System.out.println(m+" "); return tb1[n][m]; } 上記ソースコードの2次元配列について、何故「9」という数字があるのか、又1次元目と2次元目の要素数が「4」あるのかわかりませんでした。 上記のURL先で頂いた回答を元に、私は理解に努めました。その理解が正しいか判定してください。 「この勝敗表をあらわす2次元配列について、それぞれのプレイヤーのジャンケンの『手』を要素番号『1,2,3』に対応させている。つまり要素番号『0』は使っていないので、要素数が4つ必要。 また、要素番号『0』は、このjankenプログラムでは不要なので、何の値が入っても構わないので、『たまたま』9が入ってるだけで、9という数字に特に意味はない。因みに、その2つの要素番号に対応する要素が勝敗の結果の番号になる。」 こういうことでしょうか?

    • ベストアンサー
    • Java
  • 多次元配列の動的メモリ

    1次の配列aの動的メモリは例えば 「double *a;  int num = 3; //配列の数  a = new double [3];」 などとすれば確保できることは分かるのですが、 二次元配列など、多次元配列の動的メモリは どのようにすれば確保できるのですか?

  • 動的にメモリを確保した配列の要素数を調べるには

    いつもお世話になります。 int *test; *test= malloc(sizeof(int)*10); とした場合、test[10]と扱える配列の要素数(この例だと10)を 取得するにはどのようにすればよろしいのでしょうか? 通常の要素数を取得する sizeof(test)/sizeof(test[0]) とかだと無理っぽいですし。。。 どなたかご存知の方どうぞよろしくお願いします。

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

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

    • ベストアンサー
    • Flash