[H8-ML(5371)] Re: バス接続のアクセスで
From: Junsuke Kunugiza <jk@xxxxxxx>
Date: 2005年01月21日(金)19時00分38秒
椚座です。

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/

スレッド概略
[5350(R)](起点)
 └[5369(U)]
   └[表示中]
     ├[5373(1)]
     └[5375(2)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]