C 语言中的 Near、Far 和 Huge 指针
C 编程语言中使用了Near 指针、Far 指针和Huge 指针等概念来处理分段内存模型。然而,随着CPU架构的改进,这些概念在现代计算环境中已不再适用。
near、far 和 huge 指针的概念是在 MS DOS 操作系统时代的 16 位 Intel 架构中实现的。
Near 指针
C 语言中的"near"关键字用于声明一个只能访问当前数据段内内存的指针。在 16 位机器上,近指针 是只能存储 16 位地址的指针。
近指针 在给定时间内只能访问约 64 KB 的小数据,这是其主要缺点。近指针的大小为 2 个字节。
近指针的语法
<data type> near <pointer definition> <data type> near <function definition>
以下语句为变量"ptr"声明了一个近指针 -
char near *ptr;
近指针示例
查看以下示例 -
#include <stdio.h> int main(){ // 声明一个近指针 int near *ptr; // 近指针的大小 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 编译器提供了更好的内存管理技术,这些技术不依赖于分段概念。