「明解C言語」のList11-1のコードについて質問です。
まずはコードを以下に示します。
C
1#include <stdio.h> 2 3int main(void) 4{ 5 char str[] = "ABC"; /*配列で実現する文字列*/ 6 char *ptr = "123"; /*ポインタで実現する文字列*/ 7 8 printf("str = \"%s\"\n", str); 9 printf("ptr = \"%s\"\n", ptr); 10 11 return (0); 12}
上記のコードの実行結果は以下となります。
str = "ABC"
ptr = "123"
このコードにおいてprintf関数に配列strとポインタ変数ptrがそれぞれ渡されていますが、何故、%sに対してptrを渡す事によって実行結果として初期値の文字列が表示されるのかがわかりません。
配列strに関しては添字演算子[]がなく単独で現れた配列名が指定されているので、strの先頭要素のアドレスが渡されると本書にはあり、ポインタ変数ptrに関しては文字列リテラル"123"の先頭文字'1'へのポインタで初期化されるとの記述があります。
他の書籍で添字演算子[]のない配列指定は配列名のアドレスでありこれは配列の先頭要素のアドレスと同じであるとの記載がありましたので、その考えでいけば、配列str全体のアドレスが%sに渡り、文字列が表示されるのは理解ができるのですが、**ポインタptrに関しては先頭要素のアドレスが渡るだけで、文字列全体である"123"は表示できないのでは?**となんだか腑に落ちません。
私はそれだったらポインタptrはptrではなく通常の変数として扱えるptrとして%sに渡せば文字列全体を表示できるのではないかと思ったのですが、思った通りの実行結果は得られませんでした。本書の図説を見てもなんだか頭がこんがらがってしまって抜け出せないので質問させていただきました。
拙い説明となりましたが何卒ご回答をお願いします。
長文失礼致しました。
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/13 08:54