31

私は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 ページを無駄にしました。

明確化をいただければ幸いです。

4

4 に答える 4

2

int*addressの値ptrは、ステートメントによってインクリメントされています*++*ptr;(実際にはその++*ptr部分によって、先頭*は未使用の逆参照です)。したがって、 の展開は次のint *p[]ようになります。

int *p[]={a, a+2, a+2, a+3, a+4};

final++**ptr;は address の値をインクリメントしたa+2ので、元の配列は次のようになります。

int a[]={0,1,3,3,4};

于 2013-07-19T18:13:45.057 に答える