- ベストアンサー
メンバのポインタについて。
struct student { char *name; }student; int main(void) { student.name = "Saitou Takashi"; printf("%s",student.name); } に関してですが、なぜこのような事が可能なのでしょうか?nameでは不可能なのに、*nameでは可能です。それはなぜでしょうか?宜しくお願いします。
- みんなの回答 (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; のようにします。
その他の回答 (3)
- nofutureforyou
- ベストアンサー率9% (25/277)
>なぜこのような事が可能なのでしょうか? なぜ不可能だと思ったのかを書くといいでしょう。
- ddnp009
- ベストアンサー率25% (15/58)
struct student のメンバ name は、 charへのポインタを格納します。 で、"Saitou Takashi"というのはダブルクォートで囲っているため、 先頭の文字 'S' を指すポインタとして働きます。 charへのポインタ name に代入できるのは、何らおかしいことじゃありません。 ※ただしあくまでもポインタ。実体は持ってません 理解を助けるため、試しに9行目を printf("%s",student.name + 1); としてみましょう。 2文字目から表示されますよ。
- Trick--x--
- ベストアンサー率26% (19/72)
char は文字です 文字列はchar *です。 *name なのではなくてchar *なのです。 いろいろと端折って説明するとこんなところでしょうか。