• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語 ポインタ変数について)

C言語 ポインタ変数について

このQ&Aのポイント
  • ポインタ変数の値とアドレスの表示方法がわからないため、教えてください。
  • 配列の要素がなぜanimal[i]に表示されるのかがわかりません。
  • char* animal[] = {"dog", "cat", "hamster", "mouse"};の行では、animal[0]に"dog"の先頭アドレスが代入されているのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.1

printf("%p animal[%d] : %s, アドレス : %p\n", ではなくて printf("%p animal[%d] : %p, アドレス : %p\n", にするとアドレスが出ますよ。

jet888
質問者

お礼

なるほど、書式を%sにするとアドレス元の値(文字列)を表示し、%pにするとアドレスを表示することができるのですね。 %pがアドレスを表示することはわかっていたのですが、%sとなっていたのを見落としていました。 さらに*(animal+i)で値は表示するということしか理解していませんでした。 教えていただき、ありがとうございました。

その他の回答 (2)

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

既に回答されているとおり…ですね。 >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 …… と配置されている。ということでしょう。 # 文字列リラテルなので書き換え不可の領域とされているハズです。

jet888
質問者

お礼

書式を%sにするとアドレス元の値(文字列)を表示し、%pにするとアドレスを表示することができるのですね。 %pがアドレスを表示することはわかっていたのですが、%sとなっていたのを見落としていました。 さらに*(animal+i)で値は表示するということしか理解していませんでした。 非常に丁寧に教えていただき、ありがとうございました。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

> animal[0]には"dog"の先頭アドレス(00403000)が代入されているのではないのでしょうか。 そうですよ。だから、"dog" が表示される。何の不思議もありませんが、なにが不思議なんでしょうか?

jet888
質問者

お礼

書式が%sになっていることを見落としていたことと、アドレス元の値を表示するには、*(animal+i)とすることしか理解しておりませんでした。 回答いただき、ありがとうございました。

関連するQ&A