C言語のポインターに対する演算の結果について。
しばらく使わないと忘れてしまうので覚え書き。
long *lp=0;
short *wp=0;
char *cp=0;
としたとき、それぞれを++した時の実アドレスは、
lp++ == 4
wp++== 2
cw++== 1
である。
同様に、
&lp[1]のアドレスは4
&wp[1]のアドレスは2
&bp[1]のアドレスは1
である。
同じ演算子でも、ポインターの型によって得られる実アドレスが異なる。
アセンブラーでアドレスを演算する場合にも変化が伴うことがあるが、
Cとは結果が違う。
たとえば680x0MPUでは、
a0.l=0のとき、
move.l d0,(a0)+ → a0=4
move.w d0,(a0)+ → a0=2
move.b d0,(a0)+ → a0=1
であるが、
move.l d0,4(a0)
move.w d0,4(a0)
move.b d0,4(a0)
はいずれも4番地からにデータを書き込む。
自動インクリメント(またはデクリメント)は大きさを考慮するが、オフセット指定は
大きさは関係ないと言うことである。
通常加算は大きさを考慮しないので、
addq.l #1,a0
addq.w #1.a0
はいずれもa0=1となる。
アセンブラとC言語の両方に精通していると、C言語におけるポインターの演算結果を
迷うことがあったりするので、注意。
0 件のコメント:
コメントを投稿