逆参照されたポインターのポストインクリメント?

これは、C と C++ をとても楽しくする小さな落とし穴の 1 つです。脳を曲げたい場合は、これを見つけてください:

while (*dst++ = *src++) ;

文字列のコピーです。ポインターは、値がゼロの文字がコピーされるまでインクリメントされ続けます。このトリックが機能する理由がわかれば、++ がポインターに対してどのように機能するかを二度と忘れることはありません。

追記演算子の順序はいつでも括弧でオーバーライドできます。以下は、ポインター自体ではなく、ポイントされている値をインクリメントします:

(*our_var_ptr)++;

演算子の優先順位規則と ++ という事実により 後置演算子、add_one_v2() ポインターを逆参照しますが、 ++ ポインタ自体に実際に適用されています .ただし、C は常に値渡しを使用することに注意してください:add_one_v2() ローカル コピーをインクリメントしています これは、そのアドレスに格納されている値にはまったく影響しません。

テストとして、add_one_v2() を置き換えます これらのコードを使用して、出力がどのように影響を受けるかを確認してください:

void add_one_v2(int *our_var_ptr)
{
    (*our_var_ptr)++;  // Now stores 64
}

void add_one_v2(int *our_var_ptr)
{
    *(our_var_ptr++);  // Increments the pointer, but this is a local
                       // copy of the pointer, so it doesn't do anything.
}

わかりました、

*our_var_ptr++;

次のように動作します:

<オール>
  • 逆参照が最初に発生し、our_var_ptr で示されるメモリ位置が得られます (63 を含む)。
  • 次に式が評価され、63 の結果は 63 のままです。
  • 結果は破棄されます (何もしていません)。
  • our_var_ptr その後、評価後にインクリメントされます。ポインターが指している場所ではなく、ポインターが指している場所を変更しています。
  • 事実上、これを行うのと同じです:

    *our_var_ptr;
    our_var_ptr = our_var_ptr + 1; 
    

    わかる? Mark Ransom の回答には、実際に結果を使用していることを除けば、この良い例があります。