#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
出力について説明してください。アドレスにインクリメントがあるのはなぜですか?
#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
出力について説明してください。アドレスにインクリメントがあるのはなぜですか?
混乱を招く可能性がある唯一のことは、
++*p++
ポストインクリメントは逆参照演算子よりも優先順位が高いため、完全に括弧で囲んで次のようにします
++(*(p++))
を後置インクリメントp
し、 の元の値を逆参照してp
を取得しchar
、 の値を事前にインクリメントしてchar
から、新しい値を によってprintf
整数として出力します。
したがって、p
と を指しているものの両方p
がインクリメントされます。
C のポインタは、メモリ位置を表す単なる整数です。C の配列は、常に連続したメモリ ブロック内にあります。したがって、配列の 3 番目の要素を指すポインターがあり、ポインターから 1 を追加すると、4 番目の要素を指します。
あなたが混乱している場合:それは pre-incrementと post-increment++*p++
の違いによるものです。C++ が嫌いな人のための簡単なモニカがあります。(++p)
(p++)
「C++ - 言語を変更し、古い問題を返します」.
演算子の優先順位を確認する必要があります。
式++*p++
はコンパイラによって評価され((*p) + 1)
ますが、副作用もあります。 と の値をインクリメントし*p
ますp
。ASCII 互換の文字セットを使用すると、この命令は標準出力に11
( ) を出力します。'\n'+1 == 10+1 == 11
2 番目のprintf
呼び出しはs[4]
( 'c'
) の値を出力します。