Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー

非常に基本的なポインタの使い方

非常に基本的なところだと思いますが、ポインタの理解がうまくなく意図どおりのプログラムが書けません。 何らか引数を渡して(とりあえず文字列"hogehoge"を渡す)、そのポインタaをtest関数に渡して、ちゃんと"hogehoge"が渡っていれば「pass」と出力する 意図なんですが、どうもうまくいっていないようです。 ----------------------------- int test(char* a) { if(a == "hogehoge"){ printf("pass\n"); }else{ printf("ng\n"); } return 0; } int main(int argc, char* argv[]) { char* a = argv[0]; // "hogehoge"を渡しているとします。 test(a); return 0; } ----------------------------- 何がおかしいのか理解ができず、困っています。 ちなみに char* a = argv[0]; の箇所を単純に char* a = "hogehoge"; とした場合はうまくいくので、余計に混乱しております。 どなたか、正解例をご教授いただけませんでしょうか。

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

  • ベストアンサー
  • m_mik
  • ベストアンサー率26% (31/117)
回答No.2

if(a == "hogehoge"){ のところは、ポインタa のアドレスと 文字列 "hogehoge" が格納されているアドレスが等しいかと言う検査を行っています。 このとき、文字列 "hogehoge" は メモリ内の特定の領域に保存されていますので、引数で渡されたアドレスとは違うところを指してしまいます。 よって、条件が成立しません。 文字列 "hogehoge" と等しいのかを判断する場合には、strcmp() などで比較を行い、返り値によって判断する必要があります。

ooss
質問者

お礼

ありがとうございます。 strcmp()ですね! 実は一度も使ったことがないので、この機会にしっかり勉強します。

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

> char* a = argv[0]; > の箇所を単純に > char* a = "hogehoge"; > とした場合はうまくいくので、余計に混乱しております。 では、こちらのほうが(たまたま)うまくいくわけについて。 C言語で "hogehoge" とかかれた部分は、 1)メモリ上のどこかに、hogehoge というデータが保持されて、 2)その先頭のアドレス というデータになります。 ですから、 char *a = "hogehoge"; は、メモリ上にある、"hogehoge" という文字列の、先頭アドレスを渡しているだけで、文字列そのものを渡しているわけではありません。 同様に、char *a = argv[0]; は、argv[0] という文字列をポイントしている、アドレスを渡しているだけで、引数に指定したデータを直接渡しているわけではありません。 (もっと言えば、argv[0] には、引数は入っていません。通常、実行したプログラムのファイル名がはいています、実行時の引数は、argv[1] から順に格納されます) さて、C言語のコンパイラと、オプションの組み合わせによっては、「同じ文字列定数は、同じアドレスに保存する」ものがあります。 この場合、 if (a == "hogehoge") の、"hogehoge" と、 char a = "hogehoge"; の "hogehoge" は、同じアドレスに配置されます。従って、その先頭アドレスも、同じです。 このため、 char *a = "hogehoge"; で渡した値と、 if (a == "hogehoge") で、比較した、アドレス値がたまたま同じになります。 ですから、この場合は、見かけ上うまくいくわけです。

ooss
質問者

お礼

ありがとうございます。 非常に理解が深まりました。 > (もっと言えば、argv[0] には、引数は入っていません。通常、実行したプログラムのファイル名がはいています、実行時の引数は、argv[1] から順に格納されます) すみません。こちらは記載ミスです。ご指摘のとおりargv[1]です。 まだ正解にたどりつけていない状態ですが、いろいろ試してみます。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

文字列を == で比較しちゃダメ~.

ooss
質問者

お礼

ありがとうございます。 言われてみればそのような規則があった気がしています。 基本が成っていませんでした。。。

すると、全ての回答が全文表示されます。

関連するQ&A