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

struct student
{
char *name;
}student;

int main(void)
{
student.name = "Saitou Takashi";
printf("%s",student.name);
}

に関してですが、なぜこのような事が可能なのでしょうか?nameでは不可能なのに、*nameでは可能です。それはなぜでしょうか?宜しくお願いします。

A 回答 (4件)

Cでの文字列は、


charの並びと最後に\0があるという形になっていて
"String"
は、
char c[7];
c[0]='S';
c[1]='t';
c[2]='r';
c[3]='i';
c[4]='n';
c[5]='g';
c[6]='\0';
の様に初期化したのと同じようなことになります。
それで、文字列の定数を表しますが、これは、先頭のアドレスになります。
なので、
char *name="String"; //文字列の先頭アドレスがnameに設定される
とかできるということになります。
char name ;
とした場合には、アドレスでなく一文字を表しますのでアドレスを入れることはできません。
文字(列)のアドレスを保持するためにポインタとして
char *name;
のようにします。
    • good
    • 0

>なぜこのような事が可能なのでしょうか?


なぜ不可能だと思ったのかを書くといいでしょう。
    • good
    • 0

struct student のメンバ name は、


charへのポインタを格納します。

で、"Saitou Takashi"というのはダブルクォートで囲っているため、
先頭の文字 'S' を指すポインタとして働きます。

charへのポインタ name に代入できるのは、何らおかしいことじゃありません。
※ただしあくまでもポインタ。実体は持ってません

理解を助けるため、試しに9行目を
printf("%s",student.name + 1); としてみましょう。
2文字目から表示されますよ。
    • good
    • 0

char は文字です


文字列はchar *です。
*name なのではなくてchar *なのです。

いろいろと端折って説明するとこんなところでしょうか。
    • good
    • 0

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