dポイントプレゼントキャンペーン実施中!

C言語の問題でわからない内容教えてください。

#include <stdio.h>

int main(void)
{
char a[3][6] = {"red","green","blue"};
char *b[4] = {"cyan","magenta","yellow","black"};
char *p = (char*) a;
char **q = b;

printf("%s\n",(p+1));
printf("%s\n",*(q+1));
}

の中で  char **q = b;の部分は一度char *b[4] = {"cyan","magenta","yellow","black"};
でbをポインタで扱っているので、qを使用するときにポインタを使うときに**にしなければいけないと
いうことなのでしょうか?
教えてください。

通常char b[4] = {"cyan","magenta","yellow","black"};
なら、char *q = b;になるのかということです。

A 回答 (4件)

X b[4] = { ... };


に対して
X* p = b;
となります。

Xがchar*なら当然
char** p = b;
ですよね。
    • good
    • 0
この回答へのお礼

なるほど、自分が質問のソースでだした、(char*)aの部分の()は
回答者様の言う X* p = b;のbの部分だけで良いのを()つけてわかりやすく
しているという概念でよろしいでしょうか?

それならば、納得がうまくいく気がします。

お礼日時:2010/06/20 23:17

ポインタの配列ですね。

以下、unsigned を前提に書きます。
初期の状態では、bとqは同じ文字列定数の同じアドレスを指していますが、
bはポインタの配列なので、b[0],b[1],b[2]のように参照するのに対して、
qはポインタ配列へのポインタなので、q+1 や q++のように順次、指標を移動するような使い方
をするための宣言ですね。q[2]のようにはつかえません。
インクリメントを繰り返した変数qをb[0]の指標をさすように戻す場合は
再度qにbの先頭アドレスを代入するんでしょうね。
ちなみに、質問の例で、
printf("%s\n",(p+1)); 
の出力結果はわかりますか?red でもgreenでもないですよね。

この回答への補足

とりあえずそこは、visualC++でコンパイルすると,edと表示されます。

補足日時:2010/06/20 23:12
    • good
    • 0

(#1にあるんで)最後の2行は置いといてその認識であっています

    • good
    • 0
この回答へのお礼

ありがとうございます。

#4さんの回答内容であなたの言っている意味がわかりました。
ばかなので理解できませんでした。すいません。
返答ありがとうございました

お礼日時:2010/06/20 23:19

> 通常char b[4] = {"cyan","magenta","yellow","black"};


> なら、char *q = b;になるのかということです。

これは無理。"cyan"... はcharではありませんから。

char b[4] = { 'C','M','Y','K' };
char*p = b;

これならOK
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。

すいませんが、char **q=b;にしている理由も教えてほしいです。
それは一度、char *b[4]でポインタを使い
それを代入したがために
今度は**型のポインタにする必要があるということでしょうか?

また、質問となりすいませんが教えてください。

お礼日時:2010/06/20 14:50

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