• ベストアンサー

puts関数の引数には文字列の、値orアドレス?

C言語初心者です。宜しくお願い致します。 puts関数を用いて文字列を出力する場合、 puts関数の引数には、どういった形式のデータを与えれば良いのでしょうか。 char ss[5] = "abcd"; puts(ss);  /* ←アドレス */ puts("abcd");  /* ←文字列の値(これもアドレスなのでしょうか) */ puts(ss[0]); /* ←これはダメ?*/ puts(&ss[0]); /* ←これはどうでしょう?*/ 言葉使いが正しくない所があるかもしれませんが、 宜しくお願い致します。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

そういうのに悩んだ場合は、引数の型を確認しましょう。 putsの引数は型は const char * になっていると思います。つまり、期待した動作をさせるには、const char *、同等に扱われる char *, const char[], char [] 等を与える必要があります。 > puts("abcd");  /* ←文字列の値(これもアドレスなのでしょうか) */ Cでは、このような文字列定数(文字列リテラル)は、どこかの領域にその内容の文字列が用意され、そこへのポインタになります。よって、これも「アドレス」です。 プログラム風にしたらこんな感じ const char どこかの領域[]= {'a','b','c','d','\0'} ; puts( どこかの領域 ) ; > puts(ss[0]); /* ←これはダメ?*/ char []の一つ一つの要素はcharです。 char と const char *とはまったく別の型なのでダメです。 > puts(&ss[0]); /* ←これはどうでしょう?*/ ss[0]がcharなので、 &を付けるとそのアドレス( char * )になります。型としては正しいです。 もっとも、&ss[0] == ss なので、puts(ss)と同等の結果になります。 「1文字目だけ出力される」というようなことはありません。

nbsp0606
質問者

お礼

>const char *、同等に扱われる char *, const char[], char [] 等を与える必要が 「同等に扱われる」といったことに関する知識がまだまだ不足しているようです。 大変勉強になりました。 「引数の型」の見方、についてこれからしっかり勉強していきたいと思います。 初歩的な質問でしたが、基本的なことから教えて頂き、 とても助かりました。 ありがとうございます!

nbsp0606
質問者

補足

>もっとも、&ss[0] == ss なので、puts(ss)と同等の結果になります。 >「1文字目だけ出力される」というようなことはありません。 こちらも、参考になりました。 「1文字目だけ~」ということではないんですね!

関連するQ&A