0

この疑いがあったとき、私はポインターを再訪していました。

int *ptr;
int arr[5] = {10,20,30,40,50};
ptr = &arr[0];

今すぐprintf("Value: %d",*ptr);印刷します10

私が行った場合:

ptr++;
printf("Value: %d",*ptr);

結果は次のようになります。20

同様に私が行う場合:

*ptr++;
printf("Value: %d",*ptr);

結果は次のとおりです。30

しかし

printf("Value: %d",++*ptr);

私にくれます31

ptrインクリメントするとタイプintなので、次のメモリ位置に4バイトジャンプすると思いました。しかし、なぜ と ではなく に対して同じ動作を示すの*ptr++でしょptr++++*ptrか?

4

5 に答える 5

7

優先のため。

  • *ptr++と同じ*(ptr++)で、ポインタはインクリメントされますが、以前の値は逆参照されます。
  • ptr++は、まあ、と同じptr++です。
  • ++*ptrと同じです++(*ptr)。つまり、ポインタではなく、指されているものをインクリメントします。
于 2012-04-08T20:43:25.493 に答える
3

を実行すると* ptr++、実際には が実行される* (ptr++)ため、ポインターが指す変数ではなく、ポインターがインクリメントされます。

の場合++ *ptr、実際に++(* ptr)は であるため、ポインターによって返される値をインクリメントします

于 2012-04-08T20:46:08.053 に答える
2

最初のスニペットは明白です: 何ptrを指すか、つまり 10 を出力します。

2 つ目は、ポインタを 1 つの要素の前方に移動し、次の要素、つまり 20 を指します。

3 番目のスニペットは、最初の命令がポインターをインクリメントし、逆参照されるインクリメントされていない値を返すため、前のものとまったく同じですが、その結果は破棄されます。で逆参照されるのprintfは、インクリメントされたポインターで、現在は 30 を指しています。

最後のスニペットは異なります: ++*ptris ++(*ptr); (すでに を指している) を*ptr逆参照して30 を生成し、その値をインクリメントして 31 になります。ptr30++

于 2012-04-08T20:47:07.393 に答える
1

優先度の高い C Precedence の順序:

()
++
* & ポインターの場合
* /
+ -

それで、

 *ptr++ equivlant to *(ptr++)
 ++*ptr equivlant to ++(*ptr)

この行では *ptr++; ptr ポインターをインクリメントするだけです。

于 2016-05-05T14:58:19.390 に答える