次のポインター式の違いは何ですか
*ptr++
++*ptr
(*ptr)++
最初の は*ptr++;、ポインターをインクリメントし、インクリメント前にポインターが指していた値に評価されます。
2 番目の は++*ptr;、ポインターを逆参照し、ポイント先の値をインクリメントします。その値は、インクリメントされた値です。
3 番目の は(*ptr)++、ポインターを逆参照し、ポイント先の値をインクリメントします。その値は、インクリメント前のポイント先の値です。
例えばint arr[4] = { 1, 2, 3, 4 };とを考えてみましょうptr = &arr[1];。
int val = *ptr++;、ポインターはptrを指しarr[2]、valは 2 です。int val = ++*ptr;、ポインターptrは引き続き を指しarr[1]、arr[1]がインクリメントされるため、その値は 3 になり、 も同様ですval。int val = (*ptr)++;、ポインターは引き続き を指しarr[1]、arr[1]はインクリメントされるため、その値は現在 3 ですがval、古い値のarr[1]は 2 です。*(ptr++)最初の will は、現在の値で一時ポインタを返し、ptr をインクリメントするのと同等です。
2番目のものは、が指す値をインクリメントしptr(定義された型であると仮定++)、インクリメントされた値を返します
3番目のものは、が指す現在の値を返し、ptrインクリメントしますptr
元。
int a = 0;
int * ptr = &a;
int b = *ptr++;
a = 0、b = 0 ですが、ptrナンセンスを指します。
int a = 0;
int * ptr = &a;
int b = ++*ptr;
a = 1、b = 1
int a = 0;
int * ptr = &a;
int b = (*ptr)++;
a = 1、b = 0