こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

構造体とポインタについて教えてください。

#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での対象もアドレスを示していると思うのですが、
結果は値を表示しているのはなぜでしょうか?

投稿日時 - 2005-10-06 15:10:19

QNo.1695934

すぐに回答ほしいです

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

printfの%sが「渡された引数を文字列へのアドレスと思い、そのアドレスにある文字列を出力しろ」と言う意味だからです。

なので、渡す引数がアドレスなのは当然ですし、値(文字列)を表示するのも当然です。

以下の例は、すべて「文字」と言う文字列を出力します。
------------------------
printf("%s\n","文字");
------------------------
char *p;
p = "文字";
printf("%s\n",p);
------------------------
struct {
char *p;
} t;
t.p = "文字";
printf("%s\n",t.p);
------------------------
このように、リテラル文字列であれ、構造体であれ、ポインタであれ、結果は同じです。

投稿日時 - 2005-10-06 15:23:48

お礼

たいへん分かりやすい解説でした。
%sにそのような意味があったんですね。
理解できました。
ありがとうございました。

投稿日時 - 2005-10-06 16:08:12

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

こういう話かな?

それは、C言語には、2次元配列というものが存在しないからです。

char mf[2][3];
は、char の2次元配列ではなくて、

char [3]個の1次元配列が、2 個からなる配列です。
なので、mf[0]は、「配列 mf[0] の先頭アドレス」なので、char * に正しく代入できます。
その実体は、 char [3] です。

投稿日時 - 2005-10-06 15:58:39

お礼

char mf[2][3];における
mf[0]はアドレスを指しているのですね。
質問の内容はここでは、なかったのですが
この部分も理解できていなくて困っていたので助かりました。
ありがとうございました。

投稿日時 - 2005-10-06 16:13:13

ANo.2

>このプログラムで実行結果は
>牧村 五郎 (男) 30歳

と説明しているのにdata.name, data.sexの結果が
値を表示しているとは、どういうことでしょうか?

先の実行結果は、あなたが作成したプログラムの実行結果ですか?
そうでないならば、実際の実行結果を示してくれませんか?

投稿日時 - 2005-10-06 15:17:46

補足

解答ありがとうございます。
参考書に書いてあったプログラムなのですが、
ポインタなのになぜ値を示しているのかが疑問だったのです。分かりにくくてすいません。

投稿日時 - 2005-10-06 16:00:22

ANo.1

printf関数でアドレスの先頭から'\0'間での文字を表示するようになっているので正しく表示される。

投稿日時 - 2005-10-06 15:16:55