![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
for(s=p; *p; p++)の*p(ポインタ)の意味
C言語初心者です。
今ポインタを勉強しているのですが、
for文で上記のようなものが出てきて、意味が分からず困っています。
*pで*p != NULL と同じような意味になるみたいなのですが…。
どうしてそのような意味になるのでしょうか?
ちなみにsとpはポインタで、
sには配列(入力した文字列)の先頭アドレスが入っています。
pは文字列を指していて○○○○○NULL ←になるから上記のような条件で
回るんだろうなぁとはなんとなく考えているのですが。
No.4ベストアンサー
- 回答日時:
念のため:
ヌルポインタは「ビットパターンとして」0 じゃないかもしれませんが, ソースプログラムにおいて「ポインタが要求される場面」で「0」とあれば, それは「ヌルポインタ」です.
もうちょっと厳密に書くと「整定数 0」はヌルポインタに変換される.
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_04.png?8acaa2e)
No.3
- 回答日時:
まず、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は、定数ゼロを、ポインタにキャストした物が使われます。
No.2
- 回答日時:
#1 にちょっと補足:
C では, 条件は全て「値が『0』のとき偽, 『0』でないとき真」と決まっています. ですから, 条件に「*p」とだけ書かれていたら, これは「*p != 0」と同じことになります.
なお, NULL はポインタなので, 今の場合「*p != NULL」はおかしいです.
No.1
- 回答日時:
*pはforステートメントの条件式の部分に相当します。
条件式は、その式が「真」か「偽」であるかを評価し、処理を続行するかforステートメントを抜けるかを判断します。
C言語ではポインタ以外の型を持つ値はその型に関わらず真偽を判断する事が言語の仕様上可能であると定められており、値を構成するビットパターンが全て0の場合は「偽」、それ以外は「真」であるとされます。
大抵の処理系ではNULLは「0」とdefineされており、その場合*pの値がNULLになった時に条件式が偽に評価されるのでforステートメントを抜け次の式に処理が移ります。
(但しNULL定数が「0」でなければならないとは言語仕様に定められてません。NULLは元々ポインタに対して代入が可能な値なので、厳密に言えば*pの評価結果の型は値型ではなくポインタ型でなければいけません。質問内容を見る限りpは文字列を示しているので、もしNULLが0以外の値にdefineされていれば正常に動作しないでしょう。定数のNULLと'\0'を誤解しているのかもしれません。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- PHP 空文字 "" ですが 空文字の意味を教えてください。 3 2022/08/05 03:51
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- Visual Basic(VBA) ExcelVBAで質問です。離れた二次元配列を一つにしたい 4 2022/07/26 19:06
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- オープンソース 【ChatGTPのオープンソースソフトウェアを解析したことがある方、教えてくださ 2 2023/03/08 18:57
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
C言語でのconstを返す関数
-
ハンドルはポインタか
-
C言語のポインタに直接アドレス...
-
参照型で受け取った引数をポイ...
-
構造体の削除について
-
アプリを32bitから64bit移行
-
fopne で失敗する原因
-
NULLとブランクの違い
-
LPSTR型の初期化について
-
CObArrayとCPtrArrayの違い
-
お絵かきソフトにUNDO、REDOを...
-
戻り値で構造体を返すことは可...
-
main(int argc,char **argv[])...
-
ポインタの結合に関する質問です
-
_TCHAR、LPCWSTRについて
-
関数ポインタを返す関数の型をt...
-
str[i] は *(str + i) と同義で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
Cで作成したDLL関数をVBから呼...
-
ExcelVBAでのkernel32(64bit)
-
アプリを32bitから64bit移行
-
構造体とfscanf
-
c言語で任意のファイルから読み...
-
デバイスハンドルとは?
-
main(int argc,char **argv[])...
-
基本アルゴリズムの『返す』の...
-
コンストラクタでnewを失敗した...
-
C言語の関数と配列に関する質問
-
参照型で受け取った引数をポイ...
-
ハンドル、アドレス、ポインタ...
-
DLL<->VB間での受け渡し(文字...
おすすめ情報