解決済みの質問
変数の宣言は、通常、
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番目の添字は省略できない訳です。
投稿日時 - 2009-04-05 23:12:58
お礼
解答ありがとうございました。
よくわかりました。
投稿日時 - 2009-04-09 13:47:11
0人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答(2件中 1~2件目)
2次元以上の場合、「要素数」ではなくて、「型名」になるというのはみなさんおっしゃるとおりですね。
ならば、初期化子リストを見て、「型名」を決定してくれてもいいのに、という感じはしないでもないですね。
実際のところ、コンパイラの実装が難しいからじゃじゃいでしょうか?
今回は2次元なので、そう複雑でもないですが、3次元、4次元、5次元となった場合の処理が難しいので、「型名」の自動決定までは行わないと決めたというのも、ありそうな話かなと思います。
投稿日時 - 2009-04-06 12:20:58
お礼
解答ありがとうございました。
投稿日時 - 2009-04-09 13:47:33