- ベストアンサー
2次元配列
char *p[ ][2]は、 [2]で二文字しか入らないのに、 何処に、"レッドデリシャス"の様な長い文字列がはいるのでしょうか? 教えてください。 char *p[ ][2]={ {"レッドデリシャス" , "赤"}, {"ゴールデンデリシャス","黄色"}, {"ワインカップ" , "赤"}, {"ガラ" , "赤みのオレンジ色"} };
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
割り込んですいません。 すでに回答がでているようですが >考え方が、3次元配列とそっくりなんですが、 >3次元配列と同じと考えてもいいんでしょうか? 同じではないですが、3次元配列で同じ事もできます。 質問者が言語を学習中であれば、そう疑問に思うのも当然だと思います。 こういった場合まず1次元から考えてみると解りやすいかもしれません。 すでに解りやすい回答がでておりますが、参考サイトを貼っておきます。
その他の回答 (3)
- charmer29-2
- ベストアンサー率25% (41/159)
再び#2です。 >3次元配列と同じと考えてもいいんでしょうか? Cにおいて、定義するときには配列でもその後参照するときには只のポインタ演算でしかないと言うことを承知の上で、 便宜上(3次元)配列と考えるのは構わないと思います。 但し、#1さんも書いていますが参照している領域が配列ではないことは意識しておく必要があります。 #それが理由で、私は配列と考えない方をお勧めするわけですが。
お礼
すばやい回答ありがとうございました。 ポインタの配列という事ですね。 参考にしていろいろ調べて見ます。 どうもありがとうございました。
- charmer29-2
- ベストアンサー率25% (41/159)
大丈夫、その変数は2次元配列(≒配列の配列)ではなく、ポインタの2要素の配列の配列になっています。 つまり、pが全体で、p[0]が{"レッドデリシャス" , "赤"}、 p[0][0]が"レッドデリシャス"へのポインタとなるわけです。 従って、printf("%s\n", p[0][0])とすれば「レッドデリシャス」が出力されます。
お礼
回答どうもありがとうございました。 printfの出力の仕方、配列の構造など、 考え方が、3次元配列とそっくりなんですが、 3次元配列と同じと考えてもいいんでしょうか?
- precog
- ベストアンサー率22% (966/4314)
Cだよね? 宣言と演算の混同ですね。 宣言のときと演算のときでは優先順位が微妙に違うのです。宣言のときはラベルが優先するので、 char *p[][2]; は (char *)p[][2]; のように解釈されます。 つまり、これはcharを指すポインターの二次元配列なのです。 最近、やってないからちょっと怪しいですが、確かこんな感じ。 文字列が実際に入る領域は配列でもなんでもなく、単に定数域として領域確保されて初期値が入ります。(書き換えるとバグの元です)
お礼
cです! 回答どうもありがとうございました。
お礼
すばらしいサイトを紹介ありがとうございます! ありがとうございました。