次のポインター式の違いは何ですか
*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