今だけ人気マンガ100円レンタル特集♪

char *p[ ][2]は、
[2]で二文字しか入らないのに、
何処に、"レッドデリシャス"の様な長い文字列がはいるのでしょうか?
教えてください。


char *p[ ][2]={

{"レッドデリシャス"  , "赤"},
{"ゴールデンデリシャス","黄色"},
{"ワインカップ"    , "赤"},
{"ガラ"        , "赤みのオレンジ色"}
};

A 回答 (4件)

割り込んですいません。


すでに回答がでているようですが

>考え方が、3次元配列とそっくりなんですが、
>3次元配列と同じと考えてもいいんでしょうか?
同じではないですが、3次元配列で同じ事もできます。
質問者が言語を学習中であれば、そう疑問に思うのも当然だと思います。
こういった場合まず1次元から考えてみると解りやすいかもしれません。

すでに解りやすい回答がでておりますが、参考サイトを貼っておきます。

参考URL:http://www.st.rim.or.jp/~phinloda/cqa/cqa2.html
    • good
    • 0
この回答へのお礼

すばらしいサイトを紹介ありがとうございます!
ありがとうございました。

お礼日時:2006/10/27 20:53

再び#2です。


>3次元配列と同じと考えてもいいんでしょうか?
Cにおいて、定義するときには配列でもその後参照するときには只のポインタ演算でしかないと言うことを承知の上で、
便宜上(3次元)配列と考えるのは構わないと思います。

但し、#1さんも書いていますが参照している領域が配列ではないことは意識しておく必要があります。
#それが理由で、私は配列と考えない方をお勧めするわけですが。
    • good
    • 0
この回答へのお礼

すばやい回答ありがとうございました。

ポインタの配列という事ですね。

参考にしていろいろ調べて見ます。

どうもありがとうございました。

お礼日時:2006/10/27 12:47

大丈夫、その変数は2次元配列(≒配列の配列)ではなく、ポインタの2要素の配列の配列になっています。


つまり、pが全体で、p[0]が{"レッドデリシャス"  , "赤"}、
p[0][0]が"レッドデリシャス"へのポインタとなるわけです。
従って、printf("%s\n", p[0][0])とすれば「レッドデリシャス」が出力されます。
    • good
    • 0
この回答へのお礼

回答どうもありがとうございました。

printfの出力の仕方、配列の構造など、

考え方が、3次元配列とそっくりなんですが、

3次元配列と同じと考えてもいいんでしょうか?

お礼日時:2006/10/27 11:44

Cだよね?



宣言と演算の混同ですね。

宣言のときと演算のときでは優先順位が微妙に違うのです。宣言のときはラベルが優先するので、
char *p[][2]; は (char *)p[][2]; のように解釈されます。
つまり、これはcharを指すポインターの二次元配列なのです。

最近、やってないからちょっと怪しいですが、確かこんな感じ。

文字列が実際に入る領域は配列でもなんでもなく、単に定数域として領域確保されて初期値が入ります。(書き換えるとバグの元です)
    • good
    • 0
この回答へのお礼

cです!
回答どうもありがとうございました。

お礼日時:2006/10/27 11:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング