C語言中的近指標、遠指標和巨型指標



**近指標**、**遠指標**和**巨型指標**等概念曾用於 C程式語言 處理分段記憶體模型。但是,在具有改進的 CPU架構 的現代計算環境中,這些概念已不再相關。

**近指標、遠指標和巨型指標**的概念是在16位Intel架構中實現的,當時MS DOS作業系統正處於鼎盛時期。

近指標

C語言中的“**near**”關鍵字用於宣告一個只能訪問當前資料段內記憶體的 指標。在16位機器上,**近指標**是一個只能儲存16位地址的指標。

**近指標**在給定時間段內只能訪問大約64kb的小資料,這是其主要缺點。近指標的大小為2位元組。

近指標語法

<data type> near <pointer definition>
<data type> near <function definition>

以下語句聲明瞭變數“ptr”的近指標:

char near *ptr;

近指標示例

請看下面的例子:

#include <stdio.h>

int main(){

   // declaring a near pointer
   int near *ptr;

   // size of the near pointer
   printf("Size of Near Pointer: %d bytes", sizeof(ptr));
   
   return 0;
}

輸出

它將產生以下輸出:

Size of Near Pointer: 2 bytes

遠指標

**遠指標**是一個32位指標,可以訪問給定段之外的 計算機記憶體 中的資訊。要使用此指標,必須分配“段暫存器”來儲存段中的資料地址,並且還必須將另一個段暫存器儲存在最新的段中。

**遠指標**儲存指標所指向的偏移地址和段地址。當指標遞增或遞減時,只有偏移部分發生變化。遠指標的大小為4位元組。

遠指標語法

<data type> far <pointer definition>
<data type> far <function definition>

以下語句聲明瞭變數“ptr”的遠指標:

char far *s;

遠指標示例

請看下面的例子:

#include <stdio.h>

int main(){

   int number=50;
   int far *p;

   p = &number;
   printf("Size of far pointer: %d bytes", sizeof(number));

   return 0;
}

輸出

它將產生以下輸出:

Size of far pointer: 4 bytes

巨型指標

**巨型指標**與**遠指標**具有相同的大小,為32位。巨型指標還可以訪問位於段之外的位。

遠指標是固定的,因此它們所在的段部分不能以任何方式修改;但是巨型指標可以修改。

在巨型指標中,偏移地址和段地址都會發生變化。這就是為什麼我們可以使用**巨型指標**從一個段跳轉到另一個段。由於它們比較絕對地址,因此您可以對其執行關係運算。巨型指標的大小為4位元組。

巨型指標語法

以下是宣告巨型指標的語法:

data_type huge* pointer_name;

巨型指標示例

請看下面的例子:

#include <stdio.h>

int main(){

   int huge* ptr;
   printf("Size of the Huge Pointer: %d bytes", sizeof(ptr));

   return 0;
}

輸出

它將產生以下輸出:

Size of Huge Pointer: 4 bytes

需要記住的指標

在使用近指標、遠指標和巨型指標時,請記住以下幾點:

  • 近指標只能儲存前64kB的地址,而遠指標可以儲存RAM中任何記憶體位置的地址。巨型指標可以在多個記憶體段之間移動。
  • 近指標只能在一個暫存器中儲存地址。另一方面,遠指標使用兩個暫存器來儲存段地址和偏移地址。近指標的大小為2位元組,而遠指標和巨型指標的大小為4位元組。
  • 兩個遠指標值可以指向同一個位置,而在巨型指標的情況下,這是不可能的。

近指標、遠指標和巨型指標用於基於段暫存器管理分段記憶體架構中的記憶體訪問。現代系統使用平面記憶體模型,其中記憶體被定址為單個連續空間。現代C編譯器提供了更好的記憶體管理技術,這些技術不依賴於分段概念。

廣告