これは、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 を含む)。our_var_ptr
その後、評価後にインクリメントされます。ポインターが指している場所ではなく、ポインターが指している場所を変更しています。事実上、これを行うのと同じです:
*our_var_ptr;
our_var_ptr = our_var_ptr + 1;
わかる? Mark Ransom の回答には、実際に結果を使用していることを除けば、この良い例があります。