1
int main()
{
  char *p,c;
  for(p="Hello World";c=*p;++p)
  {
    printf("%c",c);
  }
}

上記のコードでは、++p はポインター 'p' が "Hello World" の次の文字を指すようにすることを知っています。また、C または C++ では配列に対して実行される境界チェックがないことも知っています。プログラムは「Hello World」です。を使用して条件をテストするにはどうすればよいですか

c=*p;

「c=*p」は何を返しますか。私の理解によると、「++p」が「hello world」の終わりに到達すると、ポインタ「p」は何らかのガベージ値を指し、ループはガベージを出力する必要があります値。

4

3 に答える 3

9

c=*p;何も返さない、それは式です。forループは代入後にの値を評価します。c

「++p」が「hello world」の終わりに到達すると、ポインタ「p」はガベージ値を指す必要があります

あまり。最後に到達する前に、ヌル終了文字-に到達します'\0'。です0。に割り当てられc、ブレーク条件を に評価しfalseます。したがって、ループは範囲外になる前に終了します。

于 2012-06-27T14:30:10.193 に答える
5

C 文字列は、定義により NULL 文字'\0'で終了します。文字列の場合は、NULL で終了する必要があります。したがってc = *p、文字列が終了すると NULL 文字を指します。これは、あなたの場合は のすぐ次の文字です'd'。また、ASCII テーブルの NULL 文字には整数値 0 があり、これは false と評価され、forループから抜け出します。

C 文字列が NULL 文字で終わらない場合 (最初は C 文字列ではありません)、基本的に文字列であることを検出する方法はありません。これは、一連のバイトとして格納されるためです。その場合、それは単にバイト配列または文字列になり、解釈方法によって異なります。

また、何も返さc = *pないのではなく、式であり、評価されます。の現在の値が指す値をvarに転送します。その値は式の最終的な評価です。e = *ppc

于 2012-06-27T14:32:54.500 に答える
3

文字列はヌル文字 (別名\0) で終了するため、最後pに文字列を終了するヌル文字を指す必要があります。したがって、これc\0false 条件と見なされます。

于 2012-06-27T14:30:50.160 に答える