2012年4月30日月曜日

C言語;ポインターの増減

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 件のコメント:

コメントを投稿