- ベストアンサー
配列で混乱しています
c言語を勉強中のものです。文字列を配列で扱う場合とポインタで扱う場合の違いにこんらんしています。 たとえば char str[] = "hello"; str = "goodby"; のように文字列の再格納はダメですが、 char *str = "helllo"; str = "goodby" は大丈夫です。 また char[100]; scanf("%s",str) は大丈夫ですが char *str; scanf("%s",str) はいけません。この2つの違いは何によるのでしょうか? またポインタはそもそも int a; int *pa; pa = &a; のように、宣言したあとはアドレスを入れる専用のハコのように考えていたのですが、 char *str = "helllo"; str = "goodby" のようにいきなりアドレスでない文字列を代入するのも納得がいきません。誰か解説をお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
ひとつづつ、解説していきましょう。 ●配列の宣言の場合 >char str[] = "hello"; これは、"hello"で初期化された、配列を宣言しています。 "hello"を格納するのに必要な分だけ、領域が確保されています。 この時の、 >str = "goodby"; は、strは配列であり、"goodby"は、文字列は"goodby"が格納されている場所 であるから、代入しようとしても、型が違う事になり、ダメです。 ●文字列へのポインタの宣言の場合 >char *str = "helllo"; strを文字列を指し示す変数として宣言してあります。 それとは、別に、"hello"と言う文字列を領域を確保して、宣言してあり、 strの初期値として、"hello"が格納されている場所を代入しています。 ですから、この時の >str = "goodby" は、"goodby"と言う文字列が格納されている場所を、 文字列を示す変数であるstrに代入している処理、と言う事になります。 ●scanfの使い方 >scanf("%s",str) scanfに渡す、strは、「char str[100]」でも、「char *str」でも、 問題ありませんが、str[100]の場合には、領域が100確保されているのに対して、 *strを渡す場合には、先に、文字列を確保可能なだけの領域を確保しておいてあげる 必要があります。 # 例えば、malloc()などを用いてです。 ●ポインタはアドレスを入れる専用の箱? >int a; >int *pa; >pa = &a; そのイメージは、正しい捉え方です。 が、 >char *str = "helllo"; >str = "goodby" この場合、*strとは、別に、 "hello", "goodby"と言う文字列が領域を確保され、存在します。 >char *str = "helllo"; はstrを文字列を指し示す変数として、宣言しています。 strの初期値として、"hello"が格納されている場所を代入している。 ですから、 >str = "goodby" も、strと言う文字列を指し示す変数に、"goodby"が格納されている場所を 代入している、と言うわけです。 「アドレス=場所」と言うイメージが掴めれば、この代入も、納得できるのでは、 ないでしょうか。
お礼
回答ありがとうございます、大変ためになりました。一気にわかりました。