ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
x86系プロセッサーの16ビット環境でのプログラミングで使われるポインターの一つ。
x86のアドレッシングの特徴でもある、「セグメント:オフセット」の形式で20ビットのアドレスをCで表現することができる。
即値代入やキャストも可能だが、概ねトラブルの元である。
実装により様々だが、内部的には32ビット変数のように振る舞い、上位16ビットがセグメント、下位16ビットがオフセットとして機能することが多かった。この場合、sizeofすると4という結果が得られるはずである。
MS-DOSやWin16のCでは、ポインター変数の定義にあたり、near/far/hugeという3つの予約語が用いられた。
これらはCの標準仕様には存在しないものであったが、これなくしてプログラミングが出来なかったため、やむを得ず利用された。
unsigned char near *np;
unsigned char far *fp;
unsigned char huge *hp;
farポインターは、このうちfarを指定したときに使われるポインターである。
なお、nearやfarを省略した場合、Cコンパイラーが自動的に判断するので必ずしも指定する必要は無いが、ポインターの種類を決め打ちしたい場合に必要となる。
farポインターへのキャストが可能。
unsigned char near *np;
unsigned char far *fp;
fp = (unsigned char far *)np;
この場合の動作は実装依存であり、結果については未定義である。殆どのCコンパイラーはセグメント拡張するが、しない可能性もある。
farポインターへの即値代入も可能だが、実装依存である。以下は一例。
unsigned char far *fp;
fp = (unsigned char far *)0xabcd0123;
この場合、abcd:0123 というアドレスに対するfarポインターとなる。このポインターを使えば、このアドレスに対して何かを書き込むことができる。
*fp = 0x00;
farポインターを整数型変数にキャストすることもできる。
unsigned char far *fp;
unsigned long l;
l = (unsigned long)fp;
この場合の動作は実装依存であり、結果については未定義である。
farポインターへの演算も可能だが、これも実装依存度が高いと見込まれる。
unsigned char far *fp;
fp = (unsigned char far *)0xaaaa0000; // fp = aaaa:0000
--fp; // fp = aaaa:ffff
加減算はオフセット部分のみに実施される可能性が高い。演算におけるオーバーフロー/アンダーフロー時にセグメント部分に影響を与えない可能性が高い。(実装依存)
コメントなどを投稿するフォームは、日本語対応時のみ表示されます