質問: "Hello"; printf("文字列は%sです。\n", str);1 printf("文字列strのアドレスは%pです。\n", str);2 return 0; } ``` 1番のstrはアドレスを表していて、*をつけることによってそのアドレスに格納されている値を指すことができる。 実際に2番で確認済み だとしたら、1はprintf("文字列は%sです。\n", *str); こう書くべきではないんですか? あと、 (ポインタ=アドレスを格納する変数) という解釈で間違いないですか?
回答: strはchar型配列のポインタとして振舞います。 ですので、ポインタの参照先はあくまでもchar型の値です。 具体的に言うと、以下のようなコードを書けます。 ``` for(char *pt = str; *pt != '\0'; pt++) { printf("%c", *pt); } printf("\n"); ``` 書式指定子%sは、文字列の先頭アドレスを受け取ったとき、ヌル文字まで表示するものです。 ですから、渡す値はポインタのままで構いません。 > > (ポインタ=アドレスを格納する変数) という解釈で間違いないですか? > > > 問題ないです。 追記 ``` #include int main() { char *str = "Hello"; printf("%s, adress: %p\n", str, str); for(char *pt = str; *pt != '\0'; pt++) { printf("%5c, adress: %p\n", *pt, pt); } printf("\n"); return 0; } ``` **実行結果** ``` Hello, adress: 00405064 H, adress: 00405064 e, adress: 00405065 l, adress: 00405066 l, adress: 00405067 o, adress: 00405068 ``` **『ヌル終端しているから、先頭の文字のアドレスを文字列のアドレスとみなせる』**んです。 一文字一文字アドレスは別個です。