2012-08-01 24 views
6

私はかなり理解していないポインタをインクリメントすることに関して質問があります。私はpPointerは、この "* pPointer = * pPointer +1" 好きに指しているものをインクリメントし、この最初のプログラムではポインタを増やす

int iTuna=1; 
int* pPointer= &iTuna; 
*pPointer = *pPointer + 1 ; //Increment what pPointer is pointing to. 
cout << iTuna << endl; 

は2つの小さなプログラムを見てみましょう。 そして、私はここに私がpPointerはこれに指しているものをインクリメントインクリメント

int iTuna=1; 
int* pPointer= &iTuna; 
*pPointer++; //Increment what pPointer is pointing to. 
cout << iTuna << endl; 
system("PAUSE"); 
return 0; 

をiTunaが「2」に変更し、プログラムが値「2」をプリントアウトし、予想通りには、「* pPointer ++」でした。しかし、ここではiTunaは "1"のままで、プログラムは値 "1"を出力します。 私はこのものが最初のものとして働くことを期待していましたが、それはしませんでした。

コードの2番目の部分が私が期待したように機能しない理由と回避方法を教えてください。

+0

使用する2つの演算子の[演算子の優先順位](http://en.cppreference.com/w/cpp/language/operator_precedence)に注意してください。 –

+1

2番目の方法では、ポインタのアドレスをインクリメントします。 だから、もしあなたがcout << pPointer;増分の前後で異なる値が得られます。 –

+1

まず逆参照してから、 '++ * pPointer'を指すポインタを増やす必要があります。 –

答えて

8
*pPointer++; 

ありがとうので、それはポインタではなく、間接参照値をインクリメント

*pPointer; 
pPointer++; 

に相当します。

あなたの問題は、演算子の優先順位の問題ですので、あなたはポインタをDEREF、その後インクリメントしたい場合は、括弧を使用することができ、

while(*source) 
    *target++ = *source++; 

のような文字列コピーの実装で随時にこれを見ることができます:

(*pointer)++; 
+0

理由を説明できますか? pPointerが何を指しているかをインクリメントするために++演算子を使う方法を教えてください –

+1

これはポインタが何を指しているかを増やします:(* pPointer)++; – allesmi

+1

'(* pPinter)++'または '* pPointer + = 1' –

1
*ptr++; - increment pointer and dereference old pointer value 

それはと同等です:

*(ptr_p++) - increment pointer and dereference old pointer value 
ここで

インクリメントする方法です++ becuaseだ値

(*ptr)++; - increment value 

*より大きい優先されていますが、()

2

を使用して優先度を制御することができ++演算子の優先順位は* Dデリファレンスよりも高くなっています。あなたはpPointerアドレスの含有量を増加されていませんが、あなたはポインタを増加している第二のプログラムで

(*p)++ 
1

を使用する必要がありますしかし、あなたが書いた何

は実際に

*(p++) 

です。ここで、pPointer値(iTunaに割り当てられたメモリ位置)が1000の場合、1000 + 2(intサイズ)= 1002になり、コンテンツは1 + 1 = 2になります。そして上記のプログラムでは、ポインタの位置の内容にアクセスしています。それで、あなたが期待した結果を得られない理由

+0

int 4ビットではありませんか? –

+0

C++では、2バイト= 16ビットです。 – AArora

0

*pPointer++; - ここで逆参照演算子(*)は、インクリメント演算子(++)よりも優先順位があります。したがって、このステートメントはまず逆参照してポインタをインクリメントします。その後、同じ値を与えるiTunaの値を印刷しています。ポインタ変数(*pPointer)の逆参照によって値が出力されないのは、クラッシュ(未定義の動作)につながるためです。 pPointerが現在インクリメントされているためです。

pPointerが指す値を増やすには、(*pPointer)++;のようにします。

インクリメントステートメント前後に変数pPointerに格納されているアドレスを明確に表示するには、

関連する問題