椚座です。 On Fri, 21 Jan 2005 17:52:41 +0900 "Kazuhiro Nonaka" <non@xxxxxxxxxxxxx> wrote: > > *((volatile _WORD *)0x20000 + 2)=0x1234; > この場合 0x20000はキャストされてるからアドレス > だけど、2ってのは、どう評価されちゃうわけですか? ここで 0x20000 は,volatile な _WORD 型へのポインタです から,2 を足すせば,ポインタは 「_WORD 二つ分」動きます。 この辺が,C言語のいちばん分かりにくいところかも知れません。 特に,ハードウェアと密接した仕事では,ついつい「番地」を 意識してしまいがちなので混乱しやすいと思いますが,ポインタの 演算は,あくまでポインタの演算であって,番地の演算では ありません。 # 足し算と思うよりも「動かす」と思った方が分かりやすいかも > *(0x20000 + (volatile _WORD *)2)=0x1234; > とは、参照するアドレスは違いますよね。それとも同じですか? 答えは「違う」。これは,0x40002 に 0x1234 が代入されます。 > もし、違うならa[b] => b[a] なのがわからないです。 > やっぱ、頭が固いですね。 ヘンなことを書いて,混乱させてしまったようで・・・ すみません。でも,落ち着いて考えれば,分かります。 ((cast *)a)[b] ---> *((cast *)a + b) b[((cast *)a)] ---> *(b + (cast *)a) では,足し算の順序は逆になっていても,キャストが付いて いるのは a のままです。だから,同じなのです。しかし, キャストの場所が変われば計算方法も変わります。これは, 記号ではなく実際の数字でやれば分かります。 *((volatile _WORD *)0x20000 + 2) は,0x20000 番地から 数えて,_WORD 2個分先と計算されます。つまり,_WORD の 大きさが 2 バイトなら,0x20000 + (2 × 2) = 0x20004。 対して,*(0x20000 + (volatile _WORD *)2) なら, 2 + (0x20000 × 2) = 0x40002 になりますよね。 椚座 淳介 (Junsuke Kunugiza) E-Mail: jk@xxxxxxx http://www.exp.org/