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编译器提供了更好的内存管理技术,这些技术不依赖于分段概念。

广告