質問: "123" このコードにおいてprintf関数に配列strとポインタ変数ptrがそれぞれ渡されていますが、**何故、%sに対してptrを渡す事によって実行結果として初期値の文字列が表示されるのかがわかりません。** 配列strに関しては添字演算子[]がなく単独で現れた配列名が指定されているので、strの先頭要素のアドレスが渡されると本書にはあり、ポインタ変数*ptrに関しては文字列リテラル"123"の先頭文字'1'へのポインタで初期化されるとの記述があります。 他の書籍で添字演算子[]のない配列指定は配列名のアドレスでありこれは配列の先頭要素のアドレスと同じであるとの記載がありましたので、その考えでいけば、配列str全体のアドレスが%sに渡り、文字列が表示されるのは理解ができるのですが、**ポインタptrに関しては先頭要素のアドレスが渡るだけで、文字列全体である"123"は表示できないのでは?**となんだか腑に落ちません。 私はそれだったらポインタptrはptrではなく通常の変数として扱える*ptrとして%sに渡せば文字列全体を表示できるのではないかと思ったのですが、思った通りの実行結果は得られませんでした。本書の図説を見てもなんだか頭がこんがらがってしまって抜け出せないので質問させていただきました。 拙い説明となりましたが何卒ご回答をお願いします。 長文失礼致しました。
回答: printf関数は%sを指定した場合、対象アドレスに格納されたデータを文字列と解釈して¥0記号まで表示し続けます。したがって、C言語上で配列をされていようが、ポインタであろうが関係はありません。 ただし、「char *ptr = "123"; 」は別の理由で望ましくない書きぶりではあります。なぜならば、配列と違って文字列リテラル「"123"」のアドレスを直指定しており、この領域の具体的な性質は不明です。一方、このポインタ宣言ではデータの書き換えを禁止しておらず、この領域を書き換えようとした場合にエラーが起きる可能性があります。