1
#include <stdio.h>
int main(void)
{
  char s[] = {'a','b','c','\n','c','\0'};
  char *p;
  p=&s[3];
  printf("%d\t",++*p++);
  printf("%d",*p);
  return 0;
}  

output: 11 99
出力について説明してください。アドレスにインクリメントがあるのはなぜですか?

4

3 に答える 3

2

混乱を招く可能性がある唯一のことは、

++*p++

ポストインクリメントは逆参照演算子よりも優先順位が高いため、完全に括弧で囲んで次のようにします

++(*(p++))

を後置インクリメントpし、 の元の値を逆参照してpを取得しchar、 の値を事前にインクリメントしてcharから、新しい値を によってprintf整数として出力します。

したがって、pと を指しているものの両方pがインクリメントされます。

于 2012-09-27T14:45:34.550 に答える
0

C のポインタは、メモリ位置を表す単なる整数です。C の配列は、常に連続したメモリ ブロック内にあります。したがって、配列の 3 番目の要素を指すポインターがあり、ポインターから 1 を追加すると、4 番目の要素を指します。

あなたが混乱している場合:それは pre-incrementと post-increment++*p++の違いによるものです。C++ が嫌いな人のための簡単なモニカがあります。(++p)(p++)

「C++ - 言語を変更し、古い問題を返します」.

于 2012-09-27T14:49:49.110 に答える
0

演算子の優先順位を確認する必要があります。
++*p++はコンパイラによって評価され((*p) + 1)ますが、副作用もあります。 と の値をインクリメントし*pますp。ASCII 互換の文字セットを使用すると、この命令は標準出力に11( ) を出力します。'\n'+1 == 10+1 == 112 番目のprintf呼び出しはs[4]( 'c') の値を出力します。

于 2012-09-27T14:48:56.310 に答える