- ベストアンサー
多次元配列
たとえば int test[]={1,2,3}; のような場合は、配列の要素数を省略できます。 しかし、多次元配列の場合は左端の添え字しか省略できないのはなざでしょうか? 例 int test[][3]={{1,2,3},{4,5,6},{7,8,9}}; 全部省略できない理由がわかりません。 どなたか教えてれませんか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
変数の宣言は、通常、 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番目の添字は省略できない訳です。
その他の回答 (2)
- titokani
- ベストアンサー率19% (341/1726)
2次元以上の場合、「要素数」ではなくて、「型名」になるというのはみなさんおっしゃるとおりですね。 ならば、初期化子リストを見て、「型名」を決定してくれてもいいのに、という感じはしないでもないですね。 実際のところ、コンパイラの実装が難しいからじゃじゃいでしょうか? 今回は2次元なので、そう複雑でもないですが、3次元、4次元、5次元となった場合の処理が難しいので、「型名」の自動決定までは行わないと決めたというのも、ありそうな話かなと思います。
お礼
解答ありがとうございました。
- koko_u_u
- ベストアンサー率18% (216/1139)
>全部省略できない理由がわかりません。 これは 『int[3]』型の配列を宣言しており、その型名までは省略できないからです。 コンパイラは int[3] 型の要素がいくつ格納されているかは親切にも数えてくれますが、それ以上は面倒をみてくれません。 そもそも、配列に格納されている型(今の場合は int[3])のサイズがわからないと、要素数を数えることができません。
お礼
解答ありがとうございました。
お礼
解答ありがとうございました。 よくわかりました。