プロが教えるわが家の防犯対策術!

ポインタ変数の値とアドレスの表示の仕方がよくわからないため、教えていただけますでしょうか。

---------------------------------------------------------------------
#include <stdio.h>

int main() {
   char* animal[] = {"dog", "cat", "hamster", "mouse"};
   int i;

   for(i=0; i<4; i++) {
     printf("%p animal[%d] : %s, アドレス : %p\n",
     animal+i, i, animal[i], *(animal+i));
   }
   return 0;
}

---------------------------------------------------------------------

このプログラムを実行すると

0022FF40 animal[0] : dog, アドレス : 00403000
0022FF44 animal[1] : cat, アドレス : 00403004
0022FF48 animal[2] : hamster, アドレス : 00403008
0022FF4C animal[3] : mouse, アドレス : 00403010

となるのですが、なぜanimal[i]のところに配列の要素(dog, cat,・・・)が表示されるのかがわかりません。
char* animal[] = {"dog", "cat", "hamster", "mouse"};の行では、
animal[0] = "dog" なら animal[0]には"dog"の先頭アドレス(00403000)が代入されているのではないのでしょうか。

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

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

お礼日時:2014/11/18 00:39

> animal[0]には"dog"の先頭アドレス(00403000)が代入されているのではないのでしょうか。



そうですよ。だから、"dog" が表示される。何の不思議もありませんが、なにが不思議なんでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/11/18 00:34

printf("%p animal[%d] : %s, アドレス : %p\n", ではなくて


printf("%p animal[%d] : %p, アドレス : %p\n", にするとアドレスが出ますよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/11/18 00:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!