13

よくわからないポインターのインクリメントについて質問があります。

2 つの小さなプログラムを見てみましょう。

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

この最初のプログラムでは、「*pPointer = *pPointer +1」のように、pPointer が指しているものをインクリメントします。そして、私が予想したように、iTunaは「2」に変更され、プログラムは値「2」を出力しました

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

ここで、pPointerがこれを指しているのは「* pPointer ++」でした。しかし、ここでは iTuna は "1" のままで、プログラムは値 "1" を出力します。これが最初のように機能することを期待していましたが、機能しませんでした。

2 番目のコードが期待どおりに機能しない理由と、それを回避する方法を教えてください。

ありがとうございました

4

6 に答える 6

25
*pPointer++;

と同等です

*pPointer;
pPointer++; 

したがって、逆参照された値ではなく、ポインターをインクリメントします。

これは、次のような文字列コピーの実装で時々見られることがあります。

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

問題は演算子の優先順位の問題であるため、ポインターを逆参照してからインクリメントする場合は、括弧を使用できます。

(*pointer)++;
于 2012-08-01T07:28:15.393 に答える
6

++ 演算子の優先順位は、*d 逆参照よりも高くなります。

あなたが書いていることは実際に

*(p++)

ただし、使用する必要があります

(*p)++
于 2012-08-01T07:29:56.413 に答える
3
 *ptr++; - increment pointer and dereference old pointer value

それは以下と同等です:

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

値を増やす方法は次のとおりです

(*ptr)++; - increment value

これは、++よりも優先順位が高いため*ですが、次を使用して優先順位を制御できます()

于 2012-08-01T07:29:48.937 に答える
1

2 番目のプログラムでは、pPointer アドレスの内容を増やしていませんが、ポインターを増やしています。ここで、pPointer の値 (iTuna に割り当てられたメモリの場所) が 1000 の場合、場所を 1000+2(int サイズ)=1002 に増やし、内容を 1+1=2 に増やしません。上記のプログラムでは、ポインターの場所の内容にアクセスしています。期待した結果が得られないのはそのためです

于 2012-08-01T07:35:11.767 に答える
0

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

like(*pPointer)++;を使用して、 が指す値をインクリメントしますpPointer

明確なアイデアを得るにはpPointer、increment ステートメントの前後に変数に格納されているアドレスを出力します。

于 2012-08-01T15:30:47.587 に答える