2012-04-08 21 views
0

私はこの疑いがあるときにポインタを再訪していました。ポインタを増やす(ptr ++)と(* ptr ++)

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); 

は、私は私がそれをインクリメントするときptrがタイプintであるため、それは次のメモリ位置に4つのバイトをジャンプするだろうと思ってくれ31

を与えます。しかし、それは*ptr++ptr++について同じ動作を示し、++*ptrでは動作しないのはなぜですか?

+0

[ptr ++は*(ptr ++)のように動作し、(* ptr)++では動作しないのはなぜですか?](http://stackoverflow.com/questions/6271028/why-does-ptr-act-like- ptr-and-not-ptr) –

答えて

2

最初のスニペットが明らかである:それはすなわち10

第一方は、次に目を指し示す一つの要素、のポインタ前方に移動させるに何ptr点を印刷第3のスニペットは、最初の命令がポインタをインクリメントし、逆参照されているがインクリメントされていないがその結果は破棄されるため、前のものと全く同じである。 printfで逆参照されるのはインクリメントされたポインタで、現在30を指しています。

最後のスニペットは異なります。++*ptr++(*ptr)です。 *ptr逆参照ptr(これはすでに30を指しています)、30を生み出し、++は31になります。

4

優先度のためです。

  • *ptr++ポインタがインクリメントされ、その値が逆参照され、*(ptr++)と同じです。
  • ptr++は、同様に、ptr++と同じです。
  • ++*ptrは、++(*ptr)と同じです。つまり、ポインターではなくポインターであることをインクリメントします。
  • あなたは、あなたが実際に * (ptr++)* ptr++やっているんので、ポインタをインクリメントします
+0

私が '*(ptr ++)'を実行するとき、 'ptr'の値を逆参照すべきではなく、ポインタを次のメモリ位置にインクリメントするのではなくインクリメントするべきですか? '++(* ptr)'ではどうなるのでしょうか? – noMAD

+1

@noMAD:いいえ、 '*(ptr ++)'の中で、かっこは 'ptr'ではなく' ptr'に '++'が適用されていることを意味します。 –

2

、ない変数++ *ptr、それは実際に++(* ptr)ですので、それはポインタ

によって返された値をインクリメントするとき、それは

を指します

1

高い優先度からCの優先順位:ポインタため

()
++
* &
*/
+ -

ので、

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

この行の* ptr ++; ptrポインタだけをインクリメントします。

0

これは、どちらも単項演算子である場合は常に、右から左に連想することです。

* ptr ++ - >最初に次の場所へのポインタをインクリメントし、その位置の値を逆参照します。

同様に、++ ptr - >最初にポインタを増分して逆参照します。

++ * ptr - >最初のptrで参照解除してから値を増やします。

関連する問題