- ベストアンサー
構造体とポインタについて教えてください。
#include <stdio.h> typedef struct ningen { char *name; char *sex; int age; } NINGEN; NINGEN data = {"牧村 五郎",NULL,30}; char mf[2][3] = {"男","女"}; void main(void) { data.sex=mf[0]; printf("%s (%s) %d歳\n", data.name, data.sex, data.age); } このプログラムで実行結果は 牧村 五郎 (男) 30歳 となるのですが、最初の typedef struct ningen { char *name; char *sex; int age; } NINGEN; のところで、nameとsexはアドレスで宣言しているので printf("%s (%s) %d歳\n", data.naem, data.sex, data.age);でのdata.naem, data.sexでの対象もアドレスを示していると思うのですが、 結果は値を表示しているのはなぜでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
printfの%sが「渡された引数を文字列へのアドレスと思い、そのアドレスにある文字列を出力しろ」と言う意味だからです。 なので、渡す引数がアドレスなのは当然ですし、値(文字列)を表示するのも当然です。 以下の例は、すべて「文字」と言う文字列を出力します。 ------------------------ printf("%s\n","文字"); ------------------------ char *p; p = "文字"; printf("%s\n",p); ------------------------ struct { char *p; } t; t.p = "文字"; printf("%s\n",t.p); ------------------------ このように、リテラル文字列であれ、構造体であれ、ポインタであれ、結果は同じです。
その他の回答 (3)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
こういう話かな? それは、C言語には、2次元配列というものが存在しないからです。 char mf[2][3]; は、char の2次元配列ではなくて、 char [3]個の1次元配列が、2 個からなる配列です。 なので、mf[0]は、「配列 mf[0] の先頭アドレス」なので、char * に正しく代入できます。 その実体は、 char [3] です。
お礼
char mf[2][3];における mf[0]はアドレスを指しているのですね。 質問の内容はここでは、なかったのですが この部分も理解できていなくて困っていたので助かりました。 ありがとうございました。
- bulgaris
- ベストアンサー率50% (8/16)
>このプログラムで実行結果は >牧村 五郎 (男) 30歳 と説明しているのにdata.name, data.sexの結果が 値を表示しているとは、どういうことでしょうか? 先の実行結果は、あなたが作成したプログラムの実行結果ですか? そうでないならば、実際の実行結果を示してくれませんか?
補足
解答ありがとうございます。 参考書に書いてあったプログラムなのですが、 ポインタなのになぜ値を示しているのかが疑問だったのです。分かりにくくてすいません。
- valvelde
- ベストアンサー率35% (46/129)
printf関数でアドレスの先頭から'\0'間での文字を表示するようになっているので正しく表示される。
お礼
たいへん分かりやすい解説でした。 %sにそのような意味があったんですね。 理解できました。 ありがとうございました。