C言語におけるニアポインタ・ファーポインタ・ヒュージポインタの違いとは?
C言語、特にMS-DOS時代の16ビット環境では、メモリの参照方法に応じて複数種類のポインタが使われていました。その代表格が「ニアポインタ(Near Pointer)」「ファーポインタ(Far Pointer)」「ヒュージポインタ(Huge Pointer)」です。本記事では、それぞれの特徴や違いについてわかりやすく解説します。
ニアポインタ(Near Pointer)とは
ニアポインタは、16ビットで表現できるアドレス範囲(最大64KB)のみを参照できるポインタです。同じセグメント内のデータにアクセスする場合に用いられ、セグメントレジスタを意識せずに高速なアクセスが可能という利点があります。
一方で、扱えるメモリ領域が64KB以内に限定されるため、大きなデータや別セグメント上のデータには対応できません。これがニアポインタの最大の弱点とされています。
ファーポインタ(Far Pointer)とは
ファーポインタは32ビットのポインタで、セグメントアドレスとオフセットアドレスの組み合わせによって、現在のセグメント外にあるメモリ領域にもアクセスできます。
使用する際には、セグメント内のデータアドレスを保持するためにセグメントレジスタを適切に設定し、必要に応じて最新のセグメント情報を保存しておく必要があります。ニアポインタよりも広いメモリ空間を扱える反面、セグメント境界をまたぐ演算(比較・加算など)には注意が必要です。
ヒュージポインタ(Huge Pointer)とは
ヒュージポインタもファーポインタと同様に32ビットサイズであり、セグメント外のメモリ領域へのアクセスが可能です。
両者の大きな違いは「正規化(normalization)」の扱いにあります。ファーポインタは固定されたセグメント部分を持つため、そのポインタが属するセグメント内の位置を変更することができません。それに対してヒュージポインタは、演算のたびにアドレスが正規化されるため、64KBのセグメント境界をまたいだ連続的なメモリ操作が可能になります。ただし、正規化処理の分だけ動作速度は若干遅くなるというトレードオフもあります。
3つのポインタの違いまとめ
- ニアポインタ: 16ビット。同一セグメント内(約64KB)のみアクセス可能。高速だが範囲が狭い。
- ファーポインタ: 32ビット。セグメント外のメモリにもアクセス可能。ただしセグメント境界をまたぐ演算は不可。
- ヒュージポインタ: 32ビット。ファーポインタと同様に広範囲へアクセスでき、正規化によりセグメント境界をまたぐ演算も可能。やや低速。
これらのポインタは16ビットPC時代の産物ですが、セグメント方式のメモリ管理やポインタの仕組みを理解するうえで今なお学習価値のある重要な概念です。
-
C言語入門:ポインタ配列とポインタへのポインタ(二重ポインタ)の基本をわかりやすく解説
はじめにC言語において、ポインタはメモリを直接扱える強力な機能です。本記事では、その応用形である「ポインタ配列」と「ポインタへのポインタ(二重ポインタ)」について、宣言方法・初期化方法・値へのアクセス方法を、サンプルコードと実行結果とともに順を追って解説します。 ポインタ配列とは通常の変数と同様に、ポインタも配列として宣言することができます。これを「ポインタ配列」と呼びます。各要素がそれぞれ別のアドレスを保持できるため、複数のデータを間接的に扱う際に便利です。 宣言方法データ型 *ポインタ名 [サイズ];例えば、次のように宣言します。int *p[5]; // int型の要素アドレスを5つ格納
-
C言語のポインタ配列とは?宣言・初期化・アクセス方法を実例付きで解説
ポインタとは、別の変数のアドレス(メモリ上の場所)を格納するための変数です。C言語においてポインタは非常に重要な概念であり、メモリを直接操作することで効率的なプログラムを作成できます。 ポインタの特徴 メモリ空間を節約できる メモリ位置へ直接アクセスするため、実行速度が速い メモリを効率的に利用でき、動的な割り当て(確保)と解放が可能 リンクリストやツリーなどのデータ構造と組み合わせて使用できる ポインタの宣言と初期化 まず、次のような文を考えてみましょう。 int qty = 179; このとき、変数はメモリ上に値「179」とそのアドレスを持つ形で表現されます。 ポインタの宣言 ポ