• ベストアンサー

ポインタに関する質問

int v; int *p=&v ポインタ変数pに変数vのアドレスを代入して、次からは、pからvの値を操作したいのですが、「*p++」としたところ、変数vの値がインクリメントされずに、pに格納されるアドレスその物がインクリメントされてしまいました 「*p+=1」とする事でvの値をインクリメントすることができましたが、 「*p+=1」このように書かれる処理は望ましい物ではないのでしょうか

質問者が選んだベストアンサー

  • ベストアンサー
  • peko_pee
  • ベストアンサー率53% (45/84)
回答No.4

目的がはっきりしていれば決して「望ましくない書き方」ではないですよ。 演算子の優先順位に気をつけていればご質問にあるような混乱も避けられると思います。 「*p++」では「*」よりも「++」のほうが優先順位が高いため、結果として「*(p++)」という 計算になります。 「*p+=1」は「+=」よりも「*」(間接参照)のほうが優先順位が高いため「(*p)+=1」となり 「(*p)++」と同等で、結果として v をインクリメントできます。 演算子の優先順位は僕自身もすべて憶えているわけではないのでの表を見なければ 自信がもてないことも多いですが、不安なときには自分の意図する計算順位になるように 上記のようにカッコを付けて順位を明示するのもひとつの手です。 ↓C言語演算子の優先順位についてはこのサイトがわかりやすいと思います。 http://www.bohyoh.com/CandCPP/C/operator.html

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★アドバイス >「*p+=1」とする事でvの値をインクリメントすることができましたが、 >「*p+=1」このように書かれる処理は望ましい物ではないのでしょうか  ↑  『(*p)++;』とすれば v をインクリメントできますけど。  演算子の優先順序や結合法則によってカッコをつけるか、  『*p += 1;』とするしかないです。 >ポインタ変数pに変数vのアドレスを代入して、次からは、pからvの値を操作したいのですが、 >「*p++」としたところ、変数vの値がインクリメントされずに、 >pに格納されるアドレスその物がインクリメントされてしまいました  ↑  これは正しい動作ですよ。  この質問はポインタの何を知りたいのですか? ・以上。

  • mizz
  • ベストアンサー率23% (6/26)
回答No.2

(*p)++; としたら変数vがインクリメントされると思いますが・・・ ちがってたらごめんなさい。

noname#69788
noname#69788
回答No.1

*(p++)と解釈されたのでしょう。ポインタはバグのもとなのでJAVAを使った方がいいと思います。

関連するQ&A