Cprogramming 简明教程

Near, Far, and Huge Pointers in C

诸如 near pointersfar pointershuge pointers 之类的概念在 C programming language 中用于处理分段内存模型。但是,这些概念在具有改进的 CPU architecture 的现代计算环境中已不再相关。

near, far, and huge pointers 的概念在16位英特尔架构中,在MS DOS操作系统时代得到实现。

Near Pointer

C中的“ near ”关键字用于声明一个 pointer ,它只能访问当前数据段内的内存。16位计算机上的 near pointer 是指针,它只能存储16位地址。

在特定时间内,一个 near pointer 只能访问大约 64 kb 的少量数据,这是它最主要的缺点。近指针的大小为 2 字节。

Syntax of Near Pointer

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

下述语句为变量“ptr”声明了一个近指针 -

char near *ptr;

Example of Near Pointer

请看以下示例:

#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

Far Pointer

一个 far pointer 是一个 32 位指针,它可以在给定段中访问 computer memory 之外的信息。要使用此指针,必须分配“段寄存器”来存储段中的数据地址,并且还必须在最近的段中存储另一个段寄存器。

一个 far pointer 存储指针正在差异的偏移量和段地址。当指针增加或减少时,只有偏移量部分会改变。远指针的大小为 4 字节。

Syntax of Far Pointer

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

下述语句为变量“ptr”声明了一个远指针 -

char far *s;

Example of Far Pointer

请看以下示例:

#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

Huge Pointer

一个 huge pointer 具有与 far pointer 相同的 32 位大小。巨大的指针还可以访问位于段之外的位。

远指针是固定的,因此它们所在的段的部分不能以任何方式修改;然而,可以修改巨大的指针。

在巨大的指针中,偏移量和段地址都会改变。这就是为什么我们可以使用 huge pointer 从一个段跳转到另一个段。当它们比较绝对地址时,可以在其上执行关系运算。巨大的指针的大小为 4 字节。

Syntax of Huge Pointer

以下是声明巨大指针的语法 -

data_type huge* pointer_name;

Example of Huge Pointer

请看以下示例:

#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

Pointers to Remember

在使用近、远和巨大指针时,请记住以下几点 -

  1. 近指针只能存储直至第一个 64kB 地址,而远指针可以存储 RAM 中任何内存位置的地址。巨大的指针可以在多个内存段之间移动。

  2. 近指针只能在单个寄存器中存储地址。另一方面,远指针使用两个寄存器来存储段和偏移量地址。近指针的大小为 2 字节,而远和巨大指针的大小为 4 字节。

  3. 两个远指针值可以指向相同的位置,但在巨大指针的情况下,则不可能。

近、远和巨大指针用于根据分段内存架构中的 segment registers 来管理内存访问。现代系统使用平面内存模型,其中内存被寻址为一个连续的空间。现代 C 编译器提供了更好的内存管理技术,这些技术不依赖于分段概念。