- ベストアンサー
ポインタ演算
http://wisdom.sakura.ne.jp/ このサイトの講座から引用 *po++; とやると、多くの人の期待に反した結果が得られると思われます このときは、アドレスが指す変数ではなくポインタの値がインクリメントされてアドレスを参照されます とありますが、実際に実行してみると、インクリメントされた後に参照 されます。なぜでしょうか、ご存知の方は回答お願いします。 OSはWindows コンパイラはBorland C++ Compilerです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>*po++; 演算順位からすると++が先に実行されますが右辺の++なので元のpoの値が使われてポインタ参照しますので、得られる値は*poと同じになるのが正しいです。その後の処理でpoを参照するとインクリメントされているはずです。 実証してみます。cygwinのgccで試しました。 #include <stdio.h> int main() { int data[2] = { 1, 4 }; int *po = data; printf( "*po=%d\n", *po ); printf( "po=%p\n", po ); printf( "*po++=%d\n", *po++ ); printf( "po=%p\n", po ); return 0; } のプログラム実行すると *po=1 po=0x22ccc0 *po++=1 po=0x22ccc4 となりました。 予定通りですので問題ありません。 これ以外の答えになりましたか?
その他の回答 (5)
- tatsu99
- ベストアンサー率52% (391/751)
このサイトにかいてある、 ---------------- *po++ とやると、多くの人の期待に反した結果が得られると思われます このときは、アドレスが指す変数ではなくポインタの値がインクリメントされてアドレスを参照されます --------------------- は、正しくは、・・・・アドレスが指す変数が参照され、その後に、ポインタがインクリメントされます。・・・となります。 従って、それは、まさにあなたが、補足した「すいません、実際は参照された後にインクリメントされる でした。」と全く同じことを言っています。
お礼
やはりそうでしたか、回答有り難うございます。
- asuncion
- ベストアンサー率33% (2127/6290)
> *po++; この文は、下記の2つの文と等価です。 *po; // まずpoが指している領域を参照してから po++; // poをインクリメントする(++po; でも同じ)
お礼
回答どうもありがとうございました。
- mikaemi
- ベストアンサー率50% (33/65)
「v は 0 になり、po は &a[0] のまま、a[0] は 1 になり、a[1] は不変。」 でした^^;
- mikaemi
- ベストアンサー率50% (33/65)
サイトに書いてあることは *po++; の意味は、 *(po++); であり、 (*po)++; じゃないですよ、って意味じゃないですかね^^ int a[] = { 0, 10 }; int *po = &a[0]; で、 int v = *po++; すると、v は 0 になり、po は &a[1] になり、a[0] も a[1] も不変。 int v = (*po)++; とすると、v は 0 になり、po は &a[0] のまま、a[1] は 1 になり、a[1] は不変。ということかな^^
お礼
回答有り難うございます。参考になりました。
- _Yu
- ベストアンサー率0% (0/2)
>実際に実行してみると、インクリメントされた後に参照 されます。 それで合っているはずです。 ポインタが指している値そのものがインクリメントされるわけではない、という事をそのサイトでは言いたいのではないでしょうか。
お礼
迅速な回答有り難うございました。
補足
すいません、実際は参照された後にインクリメントされる でした。
補足
同じ結果になります。 結局、http://wisdom.sakura.ne.jp/ このサイトの講座が間違っていると言うことでしょうか?