C 远指针和近指针的区别是什么?

C 远指针和近指针的区别是什么?,c,pointers,C,Pointers,有谁能告诉我C语言中far指针和near指针的区别吗?远近指针在DOS这样的旧平台上使用过 我认为它们与现代平台无关。但你可以了解它们,并且(正如其他答案所指出的那样)。基本上,far指针是扩展计算机中可寻址内存的一种方法。即,在16位平台中寻址超过64k的内存。在16位x86分段内存体系结构上,四个寄存器用于引用各自的段: DS→ 数据段 CS→ 代码段 党卫军→ 堆栈段 ES→ 额外段 此体系结构上的逻辑地址写入段:偏移量。现在回答问题: 近指针(作为偏移量)指向当前段 远指针使用段信

有谁能告诉我C语言中
far
指针和
near
指针的区别吗?

远近指针在DOS这样的旧平台上使用过


我认为它们与现代平台无关。但你可以了解它们,并且(正如其他答案所指出的那样)。基本上,far指针是扩展计算机中可寻址内存的一种方法。即,在16位平台中寻址超过64k的内存。

在16位x86分段内存体系结构上,四个寄存器用于引用各自的段:

  • DS→ 数据段
  • CS→ 代码段
  • 党卫军→ 堆栈段
  • ES→ 额外段
此体系结构上的逻辑地址写入
段:偏移量
。现在回答问题:

  • 近指针(作为偏移量)指向当前段

  • 远指针使用段信息和偏移量跨段指向。因此,要使用它们,必须将DS或CS更改为指定的值,取消对内存的引用,然后恢复DS/CS的原始值。请注意,它们上的指针算法不会修改指针的段部分,因此溢出偏移量只会将其环绕

  • 然后是巨大的指针,这些指针被规范化为具有给定地址的最高可能段(与远指针相反)


在32位和64位体系结构上,内存模型使用不同的段,或者根本不使用。

指针基本上保存地址。众所周知,英特尔内存管理分为4个部分。 因此,当指针指向的地址位于同一段内时,它是一个近指针,因此它只需要2个字节的偏移量。
另一方面,当指针指向段外的地址(即在另一段中)时,该指针就是远指针。它由4个字节组成:两个用于段,两个用于偏移。

四个寄存器用于引用16位x86分段内存体系结构上的四个段。DS(数据段)、CS(代码段)、SS(堆栈段)和ES(额外段)。这个平台上的逻辑地址是十六进制写的段:偏移量

近指针(作为偏移量)指向当前段

远指针使用段信息和偏移量跨段指向。因此,要使用它们,必须将DS或CS更改为指定的值,取消对内存的引用,然后恢复DS/CS的原始值。请注意,它们上的指针算法不会修改指针的段部分,因此溢出偏移量只会将其环绕

然后是巨大的指针,这些指针被规范化为具有给定地址的最高可能段(与远指针相反)


在32位和64位体系结构上,内存模型使用不同的段,或者根本不使用。

在DOS中,处理寄存器有点滑稽。和部分。所有关于RAM的最大计数容量

今天,这几乎无关紧要。您需要了解的只是虚拟/用户空间和内核的区别

自从win nt4(当他们从*nix窃取想法时)开始,微软程序员开始使用所谓的用户/内核内存空间。 从那时起就避免了直接访问物理控制器。从那时起,我们也解决了直接访问内存段的问题通过操作系统,一切都变成了R/W

然而,如果您坚持理解和操作远/近指针,请查看linux内核源代码及其工作原理,我想您会回来的

如果您仍然需要在DOS中使用CS(代码段)/DS(数据段)。看看这些:


我想在下面指出一个完美的答案。。来自伦丁。我太懒了,回答不恰当。伦丁给出了非常详细和合理的解释“竖起大拇指”

既然没有人提到DOS,那就让我们忘掉旧的DOS PC电脑,从一个通用的角度来看待这个问题吧。然后,非常简单,它是这样的:


任何CPU都有一条数据总线,它是CPU在一条指令中可以处理的最大数据量,即等于其寄存器的大小。数据总线宽度以位表示:8位、16位或64位等。这就是术语“64位CPU”的来源——它指的是数据总线

任何CPU都有一个地址总线,也有以位表示的特定总线宽度。计算机中CPU可以直接访问的任何内存单元都有一个唯一的地址。地址总线足够大,可以覆盖所有可寻址内存

例如,如果一台计算机有65536字节的可寻址内存,您可以使用16位地址总线2^16=65536来覆盖这些字节

通常,但并非总是,数据总线宽度与地址总线宽度一样宽。如果它们的大小相同,那就更好了,因为这样可以使CPU指令集和为其编写的程序更清晰。如果CPU需要计算一个地址,那么如果该地址足够小,可以放入CPU寄存器(当涉及到地址时,通常称为索引寄存器)中,就很方便了


非标准关键字
far
near
用于描述系统上的指针,在这些系统中,您需要寻址超出正常CPU地址总线宽度的内存。

例如,具有16位数据总线的CPU也具有16位地址总线可能比较方便。但同一台计算机可能还需要2^16=65536字节=64kB以上的可寻址内存

CPU通常会有特殊指令(稍微慢一点),允许它寻址64kb以外的内存。例如,CPU可以将其大内存划分为
n
页(有时也称为bank、segments和其他类似术语,这可能意味着从一个CPU到另一个CPU有不同的含义)