- ベストアンサー
C言語 ポインタ変数について
- ポインタ変数の値とアドレスの表示方法がわからないため、教えてください。
- 配列の要素がなぜanimal[i]に表示されるのかがわかりません。
- char* animal[] = {"dog", "cat", "hamster", "mouse"};の行では、animal[0]に"dog"の先頭アドレスが代入されているのでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
printf("%p animal[%d] : %s, アドレス : %p\n", ではなくて printf("%p animal[%d] : %p, アドレス : %p\n", にするとアドレスが出ますよ。
その他の回答 (2)
- Wr5
- ベストアンサー率53% (2173/4061)
既に回答されているとおり…ですね。 >animal[0] = "dog" なら animal[0]には"dog"の先頭アドレス(00403000)が代入されているのではないのでしょうか。 もちろん代入されています。 「dogなりcatなりの文字列」が表示されるのは#1さんで指摘されているとおり、%sだから。 >0022FF40 animal[0] : dog, アドレス : 00403000 最初の16進は「char*型の配列変数animalの各要素」のアドレス。 # たぶんスタック上。 ポインタなんで次の要素のアドレスは文字列の長さに関係なく4バイト(32ビット)先ですね。 次の「animal[※]」は配列の添え字。 まぁ、何番目か。というのを判りやすくするため。 その次のdogとかは「ポインタが指している先に格納されている文字列」です。 アドレスのあとの16進数が、その文字列が実際に格納されているアドレスです。 # ポインタが指している先とも言う。 表示されている状況からするとメモリイメージとしては… 00403000 64 6F 67 00 63 61 74 00 68 61 6D 73 74 65 72 00 00403010 6D 6F 75 73 65 00 …… と配置されている。ということでしょう。 # 文字列リラテルなので書き換え不可の領域とされているハズです。
お礼
書式を%sにするとアドレス元の値(文字列)を表示し、%pにするとアドレスを表示することができるのですね。 %pがアドレスを表示することはわかっていたのですが、%sとなっていたのを見落としていました。 さらに*(animal+i)で値は表示するということしか理解していませんでした。 非常に丁寧に教えていただき、ありがとうございました。
- notnot
- ベストアンサー率47% (4900/10358)
> animal[0]には"dog"の先頭アドレス(00403000)が代入されているのではないのでしょうか。 そうですよ。だから、"dog" が表示される。何の不思議もありませんが、なにが不思議なんでしょうか?
お礼
書式が%sになっていることを見落としていたことと、アドレス元の値を表示するには、*(animal+i)とすることしか理解しておりませんでした。 回答いただき、ありがとうございました。
お礼
なるほど、書式を%sにするとアドレス元の値(文字列)を表示し、%pにするとアドレスを表示することができるのですね。 %pがアドレスを表示することはわかっていたのですが、%sとなっていたのを見落としていました。 さらに*(animal+i)で値は表示するということしか理解していませんでした。 教えていただき、ありがとうございました。