質問: (*p) + 1; /* *pで示しているアドレスから、終わりのNULLまでを表示します。*/ printf("*p:%s\n", &(*p)); /* strの中身も表示します。 */ printf("str:%s\n", str); } } ```
回答: > > printf("str:%s\n", p);となぜ書いてはいけないのですか? > > > はどうしてそう考えたのでしょうか?全然問題のないコードだと思います。 `printf("*p:%s\n", &(*p))`がよくて`printf("str:%s\n", p);`がいけない理由はありません。 どちらかというと`printf("*p:%s\n", &(*p))`の方が問題だと思います。 `&(*p))`がアドレスであることを明示する意図があるかもしれませんが、通常こんな書き方はしません。 `char *p;`において、`&(*p)`と`p`は同じです。ちなみに`&(*(&(*p)))`も`p`と同じです。 「&領域」は領域のアドレスを意味し、「*アドレス」はアドレスの指し示す領域の内容です。 pにchar型の領域アドレスが格納されていて、その領域に0個以上の文字コードが格納されていて、ゼロ終端であれば、`printf("*p:%s\n", &(*p))`と同様に`printf("str:%s\n", p);`は問題なく動きます。