- ベストアンサー
文字列って何なの?
ど素人です。ポインタと文字列で躓いています。 まず、以下のようなプログラムをテスト的な意味で作りました。 ****************************************************** #include<stdio.h> int main(void){ char *str = "harehareyukai"; if (str == "harehareyukai"){ printf("haruhi"); }else{ printf("nagato"); } } ****************************************************** これを実行すると haruhi という結果になります。 そこで質問なのですが、*strはポインタ変数として宣言してます。 したがってstrの値は0x10101010みたいな(適当ですが)アドレスが入っているはずです。 なのに何故str == "harehareyukai"が真になるのでしょうか? (自分は最初 *str == "harehareyukai"が真になると思っていましたが違っていました。) というか"harehareyukai"という「文字列」は評価されるとどういう存在になるのでしょうか。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
手元のBorland C++ Compilerでは、if文が成り立たず、 nagato と出力しました。 コンパイラによっては、 ・strを初期化するときの"harehareyukai" ・strとの比較に使うときの"harehareyukai" が同じ「内容の」文字列リテラルであるため、 最適化か何か(同じ内容の文字列リテラルを同じ領域に確保する)を 行なった結果、if文が成り立つのではないでしょうか。
その他の回答 (3)
- realnick
- ベストアンサー率25% (3/12)
アドレスの割り当てはコンパイラに依存します. 普通に最適化すれば同じ文字列は同じアドレスにするものですが,最適化オプションやデバッグ構成によっては別アドレスになることもあります >なるほど。文字列自体にアドレスが当てられるのですか。 それは先頭文字のアドレスとかでしょうか? あと申し訳ないのですが、追加で質問があります。 最初の*strを宣言したときの"harehareyukai"と ifのなかの"harehareyukai"は何故同じアドレスにあるのは何故なんでしょうか。 例えば 最初の"harehareyukai\0"は メモリの0~12番地、 後の"harehareyukai"は メモリの24~36番地、にある。だからアドレスは異なる、ってことは 起こらないのでしょうか?
お礼
よくわかりました。ありがとうございました!
char *str と宣言したので strには文字列のポインタが入りますよね char *str = "harehareyukai"; こうすると、どこかに "harehareyukai" を格納する領域を確保して そのアドレスをstrに格納します if (str == "harehareyukai") これが真になるのがちょっと理解できなかったりします・・・ str(アドレス)と "harehareyukai"のアドレスを比較するので 同じ領域を指していれば真になりますが 最初の"harehareyukai" と if文の中の"harehareyukai"は違う文字列なはずなのですが コンパイラによっては一致してしまうんでしょうか
お礼
すみません、ANo.1様に返答中に150wpm様のレスがついてしまいました。 僕もそこで悩んでいるのですがコンパイラしだいなのでしょうか。 ちなみにコンパイラはcygwin上でgccを使っています。
- realnick
- ベストアンサー率25% (3/12)
"harehareyukai"を評価する場合,その文字列をさすアドレスになります.また *str==str[0]=='h' ですね.
お礼
なるほど。文字列自体にアドレスが当てられるのですか。 それは先頭文字のアドレスとかでしょうか? あと申し訳ないのですが、追加で質問があります。 最初の*strを宣言したときの"harehareyukai"と ifのなかの"harehareyukai"は何故同じアドレスにあるのは何故なんでしょうか。 例えば 最初の"harehareyukai\0"は メモリの0~12番地、 後の"harehareyukai"は メモリの24~36番地、にある。だからアドレスは異なる、ってことは 起こらないのでしょうか?
お礼
なるほど!すっきりしました。ありがとうございました。