私はCポインターの文献を手に入れようとしています。イラストの 1 つで、次のコードに遭遇しました。
# include <stdio.h>
int main()
{
static int a[]={0,1,2,3,4};
static int *p[]={a, a+1, a+2, a+3, a+4};
int **ptr;
ptr =p;
**ptr++;
printf("%d %d %d\n", ptr-p, *ptr-a, **ptr);
*++*ptr;
printf("%d %d %d\n", ptr-p, *ptr-a, **ptr);
++**ptr;
printf("%d %d %d\n", ptr-p, *ptr-a, **ptr);
return 0;
}
出力を次のように受け取ります。
1 1 1
1 2 2
1 2 3
この出力を正当化する際に問題に直面しています。問題を簡単に把握できるように、コピーにたくさんのボックスを作成しました。私は出力を正当化することができます1 1 1
.私の問題はステートメントから始まり*++*ptr
ます.
したがって、単項演算子は右から左に実行されます。そのため、*ptr
最初に取り組み、次に の値をptr
増やします。このインクリメントの後、何が起こるかわかりません。本によるとp
、この配列の次の要素を指すように何らかの形でインクリメントされます。出力1 2 2
は の増分によってのみ達成できますp
。
この種の質問がstackoverflowに正確に適合するかどうかはわかりません。
私は最善を尽くし、ボックスが描かれた少なくとも 10 ページを無駄にしました。
明確化をいただければ幸いです。