C 语言中的 Near、Far 和 Huge 指针

2024年8月28日 | 阅读 4 分钟

在本文中,我们将学习一些在早期的 Ms-Dos 时代,通常在 16 位 Intel 架构中使用的旧概念,但如今已不再常用。尽管如此,这些概念仍然非常重要,因为它们就像是当前技术的基石。然而,根据内存模型和段,指针可以分为三种类型,它们如下:

  • Near 指针
  • Far 指针
  • Huge 指针

Near 指针

一般来说,我们可以认为 near 指针用于存储地址,其最大大小仅为 16 位。使用 near 指针,我们无法存储大于 16 位大小的地址。然而,我们可以存储所有在 16 位限制内的其他较小地址。您可能会认为 16 位有点小,因为我们一次只能访问 64KB 的数据。因此,它被认为是 near 指针的主要缺点之一,这就是为什么它不再常用。让我们看看一些有助于我们理解 near 指针的其他重要要点。

语法

语法如下:

以下语句为变量 s 声明了一个 near 指针

让我们看看一些有助于我们理解“Near”指针的其他重要要点。

  • Near 指针无法访问数据段以外的区域,例如图形视频内存、文本视频内存等。Near 指针的大小为两个字节。借助 near 关键字,我们可以将任何指针变成 near 指针。
  • 它是一个在内存的 64KB 数据段范围内工作的指针。
  • 它无法访问给定数据段之外的地址。
  • 可以使用算术运算符在地址范围内递增或递减 near 指针。

为了更详细地理解“Near”指针,让我们看一个例子

示例

输出

2

Far 指针

一般来说,Far 指针通常被认为是 32 位大小的指针。然而,它也可以访问存储在计算机内存当前段之外的信息。尽管使用这种类型的指针,我们通常需要分配段寄存器来存储当前段中的数据地址。此外,我们还需要分配另一个寄存器来存储当前段内的偏移量。

语法

语法如下

以下语句为变量 s 声明了一个 far 指针

让我们看看一些有助于我们理解 Far 指针的其他重要要点。

  • 当指针递增或递减时,只有偏移量部分会发生变化。
  • 它是一种存储指针所指向的偏移量和段地址的指针。
  • Far 指针的地址范围从 0 到 1MB。
  • 它可以访问所有 16 个段。

示例

输出

4

Huge 指针

与 far 指针一样,huge 指针的大小也是 32 位,但它甚至可以访问存储或位于段之外的位。然而,far 指针与 huge 指针非常相似,但它仍然比 far 指针具有一些优势。例如,Far 指针是固定的;因此,它们存储或位于的那个段的部分无法以任何方式更改或修改。然而,huge 指针并非如此,因为 huge 指针具有弹性,允许它这样做。

让我们看看一些有助于我们理解“Huge”指针的其他重要要点。

  • 可以指向内存中任何段的指针称为 huge 指针。huge 指针的大小为4 字节或 32 位,它可以访问内存中高达 64K 的大小。
  • huge 指针可以递增而不会出现段绕行问题。

以下给出的示例显示了 huge 指针的用法。

示例

输出

4 4 1

在给定的程序中,p 是 huge 指针,*p 是 far 指针,而 **p 是 char 类型的数据变量。

Near、Far 和 Huge 指针之间有什么区别?

一般来说,虚拟地址由选择器和偏移量组成。Near 指针没有显式的选择器,而 huge 指针有显式的选择器。当我们对 far 指针执行指针算术时,选择器不会被修改,但在 huge 指针的情况下可能会被修改。

注意:这些是非标准关键字,也是特定于实现的,并且在现代平台中已不再相关。