C のポインタは、演算子の優先順位が違う

(C言語ポインタ操作の本質まとめ)

C 言語でポインタを使った式は、演算子の優先順位結合規則によって意味が dramatically に変わる。
特に *(間接参照)と ++(インクリメント)は、組み合わせ次第で “全く違う動作” になる。


🔥 1. 優先順位が違うと意味が変わる代表例

C の解釈動作の意味
*p++*(p++)現在の値を読み、後でポインタを進める
*++p*(++p)先にポインタを進め、次の値を読む
(*p)++後置インクリメント値を返した後、値を+1する(ポインタは動かない)
++*p++(*p)p が指す値そのものを先に +1 する
*(p--)*p, その後 p を左へ進める現在値を読み、後で左に移動

同じ *++ の組み合わせでも動作が完全に変わる。


🔍 2. なぜ動作が違うのか? → 演算子の優先順位

C の演算子の重要部分(上位だけ):

  1. 後置演算子p++, p--, a[i], a->b
  2. 前置/単項演算子++p, --p, *p, &p
  3. その他(+、-、=)…

これにより、一見同じような式でも
どの部分が先に評価されるかが変わり、結果は全く別物になる。


🧠 3. 各式の内部動作の違い

✔ *p++(最もよく使う)

*(p++)
  • 元の p が指す値を返す
  • その後で p を 1つ進める
  • 配列走査で最もよく使われる形

✔ *++p

*(++p)
  • p を1つ進めてから
  • 進めた先の値を返す
    → 次の要素を読む

✔ (*p)++

  • p は動かない
  • p が指す値が後置インクリメント
  • 値が変わる(H → I),ポインタはそのまま

✔ ++*p

++(*p)
  • p を進めず
  • 値を先に +1
  • H → I
  • その結果を返す

📌 4. ポインタ操作は「どこに ++ がついているか」で決まる

操作意味
p++アドレスを後で進める(postfix)
++pアドレスを先に進める(prefix)
*pp の指す値を取り出す
(*p)++p の指す値を後で +1
++(*p)p の指す値を先に +1

この組み合わせで動きが分かれる。


🌟 5. 覚え方(最重要)

✔ 後置 p++ → アドレスが動く

✔ 前置 ++p → 値が変わる

(※ “値” と “アドレス” のどちらに作用するかが違う)

✔ * は「参照先へアクセスする」

→ どの段階で値を読むかで結果が分かれる


📝 6. まとめ(この項目の結論)

  • C のポインタ式は 演算子の優先順位で完全に意味が変わる
  • *p++++*p は、見た目が似ているが
    内部構造(どれを先に計算するか)が違うため全く別の動作になる
  • ポインタ操作を理解するには
    優先順位 → 結合規則 → メモリの指す位置
    をセットで考える必要がある
  • 「どこに ++ がつくか」が、
    ポインタが進むのか、値が変わるのか を決める

\ 最新情報をチェック /

コメント

PAGE TOP
タイトルとURLをコピーしました