|
ども。
>C言語の本や、HPなどみてるとよく、
>”絶対アドレス指定”とか、”相対アドレス指定”とかって
>記述があるんすけど、どうちがうんですか?
なんだかアセンブリな香りのする記述ですが、C言語レベルでおおざっぱな
説明をすると、
base_address + offsert
の形式のアドレス指定が相対アドレッシングで、それ以外は絶対ということ
になります(多重のポインタの話はここではおいておきます)。
普通はbase_addressはアドレス(配列名ないしポインタ)で、offsetは整数値
です。両方とも変数の場合と、片方は定数の場合がありますが、実際に
使われる場面ではどちらか一方は(少なくとも局所的に)一定値になります。
両方とも毎回値が変わっているとすれば、それは相対アドレッシングでは
なく、その後の絶対アドレッシングによるアクセスのためのアドレス計算を
行っているといえます(たぶん)。
# なお、base_addressは普通は非零です。0だと絶対アドレスと同じことに
# なってしまいますので。
相対アドレッシングがC言語レベルで明示的に現れる例は配列(演算子)です。
配列演算子E1[E2]は*(E1+E2)と等価であること思い出してください。
別に配列じゃなくても前述のポイントをおさえていれば相対アドレッシング
なのですけど。
実装やアセンブリのことまで考えると、まだいろいろあるのですが、
とりあえずはこれくらいで。
なお、絶対/相対という考え方は、C言語では他に、fseek()にでてきます。
この場合、第3引数がベース、第2引数がオフセットとなります。第3引数が
SEEK_SETの場合はベースが先頭(=0)になるので、絶対指定ともいえますが。
では。
|