- ベストアンサー
for(s=p; *p; p++)の*p(ポインタ)の意味
for(s=p; *p; p++)の*p(ポインタ)の意味 C言語初心者です。 今ポインタを勉強しているのですが、 for文で上記のようなものが出てきて、意味が分からず困っています。 *pで*p != NULL と同じような意味になるみたいなのですが…。 どうしてそのような意味になるのでしょうか? ちなみにsとpはポインタで、 sには配列(入力した文字列)の先頭アドレスが入っています。 pは文字列を指していて○○○○○NULL ←になるから上記のような条件で 回るんだろうなぁとはなんとなく考えているのですが。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
念のため: ヌルポインタは「ビットパターンとして」0 じゃないかもしれませんが, ソースプログラムにおいて「ポインタが要求される場面」で「0」とあれば, それは「ヌルポインタ」です. もうちょっと厳密に書くと「整定数 0」はヌルポインタに変換される.
その他の回答 (3)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
まず、char *p に対して、for(s = p; *p; p++) に現れる、*p の型は(ポインタではなく)char そのものです。 ですから、*p は、「p がポイントしているところにある char のデータ」です。 一方、Cでは、文字列は、「'\0' で終端される」という規定になっています。 ですから、ちょっとくどく書けば、 for(s = p; *p != '\0' ; p++) ということで、「p がポイントする文字が、終端文字(文字列の終わり)にくるまで」という意味です。 そして、(Cのいろいろな背景から) *P != '\0' という表記は、 *P とだけ書いた時と同じ動作をします。 このため、文字列の終端をチェックするために、while(*p) とか、if(! *P) (こっちは、終端にきたときの判断)とかよく使われる表現です。 なお、NULL は、「何もポイントしていないポインタ」の値です。 そして、ちょっと面倒なのが、規格上は、「ヌルポインタ(何もポイントしていないポインタ)の値は、定数0と比較したときに等しくなる」と定義されている点です。 つまり、直接、「ヌルポインタはゼロである」という保証はありません。ただし、0と比較したときに等しくなるということは保証されています。そういうわけで、NULLは、定数ゼロを、ポインタにキャストした物が使われます。
- Tacosan
- ベストアンサー率23% (3656/15482)
#1 にちょっと補足: C では, 条件は全て「値が『0』のとき偽, 『0』でないとき真」と決まっています. ですから, 条件に「*p」とだけ書かれていたら, これは「*p != 0」と同じことになります. なお, NULL はポインタなので, 今の場合「*p != NULL」はおかしいです.
- uzaiosietekun
- ベストアンサー率0% (0/1)
*pはforステートメントの条件式の部分に相当します。 条件式は、その式が「真」か「偽」であるかを評価し、処理を続行するかforステートメントを抜けるかを判断します。 C言語ではポインタ以外の型を持つ値はその型に関わらず真偽を判断する事が言語の仕様上可能であると定められており、値を構成するビットパターンが全て0の場合は「偽」、それ以外は「真」であるとされます。 大抵の処理系ではNULLは「0」とdefineされており、その場合*pの値がNULLになった時に条件式が偽に評価されるのでforステートメントを抜け次の式に処理が移ります。 (但しNULL定数が「0」でなければならないとは言語仕様に定められてません。NULLは元々ポインタに対して代入が可能な値なので、厳密に言えば*pの評価結果の型は値型ではなくポインタ型でなければいけません。質問内容を見る限りpは文字列を示しているので、もしNULLが0以外の値にdefineされていれば正常に動作しないでしょう。定数のNULLと'\0'を誤解しているのかもしれません。)