(C言語ポインタ操作の本質まとめ)
C 言語でポインタを使った式は、演算子の優先順位と結合規則によって意味が dramatically に変わる。
特に *(間接参照)と ++(インクリメント)は、組み合わせ次第で “全く違う動作” になる。
🔥 1. 優先順位が違うと意味が変わる代表例
| 式 | C の解釈 | 動作の意味 |
|---|---|---|
*p++ | *(p++) | 現在の値を読み、後でポインタを進める |
*++p | *(++p) | 先にポインタを進め、次の値を読む |
(*p)++ | 後置インクリメント | 値を返した後、値を+1する(ポインタは動かない) |
++*p | ++(*p) | p が指す値そのものを先に +1 する |
*(p--) | *p, その後 p を左へ進める | 現在値を読み、後で左に移動 |
同じ * と ++ の組み合わせでも動作が完全に変わる。
🔍 2. なぜ動作が違うのか? → 演算子の優先順位
C の演算子の重要部分(上位だけ):
- 後置演算子:
p++,p--,a[i],a->b - 前置/単項演算子:
++p,--p,*p,&p - その他(+、-、=)…
これにより、一見同じような式でも
どの部分が先に評価されるかが変わり、結果は全く別物になる。
🧠 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) |
*p | p の指す値を取り出す |
(*p)++ | p の指す値を後で +1 |
++(*p) | p の指す値を先に +1 |
この組み合わせで動きが分かれる。
🌟 5. 覚え方(最重要)
✔ 後置 p++ → アドレスが動く
✔ 前置 ++p → 値が変わる
(※ “値” と “アドレス” のどちらに作用するかが違う)
✔ * は「参照先へアクセスする」
→ どの段階で値を読むかで結果が分かれる
📝 6. まとめ(この項目の結論)
- C のポインタ式は 演算子の優先順位で完全に意味が変わる
*p++と++*pは、見た目が似ているが
内部構造(どれを先に計算するか)が違うため全く別の動作になる- ポインタ操作を理解するには
優先順位 → 結合規則 → メモリの指す位置
をセットで考える必要がある - 「どこに ++ がつくか」が、
ポインタが進むのか、値が変わるのか を決める

コメント