发布网友 发布时间:2024-07-22 09:37
共1个回答
热心网友 时间:2024-08-02 02:09
除了熟知的近指针和远指针,计算机系统中还存在一个名为巨指针的概念。巨指针同样具备32位的特性,其结构包括16位的段地址和偏移,能够寻址任何地址。然而,它与远指针的关键差异在于进行了规格化处理。远指针未经规范化,可能导致两个不同的指针(如23B0:0004和23A1:00F4)指向同一物理地址,但其段地址和偏移不一致。巨指针通过特殊的算法确保每次操作后,偏移量始终小于10h,只有最低4位有效,其余部分进位到段地址,以此避免远指针在64K边界时的意外重置问题。操作范围必须限制在64K以内。下面的函数展示了如何将远指针转换为巨指针:
c
void normalize(void far ** p)
{
*p = (void far *)(((long)*p & 0xffff000f) + (((long)*p & 0x0000fff00) << 12));
}
这段代码展示了指针间接赋值的用法,因为函数需要改变指针的值,所以它需要接收一个指向指针的指针作为输入。
值得注意的是,近指针、远指针和巨指针是16位段寻址处理器的产物,主要适用于早期的计算机架构。现代的32位处理器,如80386及更高版本,通常工作在保护模式下,指针是统一的32位,可以直接访问内存地址,远近指针的概念不再适用。但在嵌入式系统领域,如AMD的AM186ED和AM186ER处理器,依然常见,因此理解不同指针的寻址特性仍然是必要的。
若想深入了解这些概念,建议进一步学习微机原理、8086汇编,以及查阅C/C++高级编程相关书籍以深化理解。
巨指针是32位的指针,它其实是规格化的指针,其实它与远指针就差在规格化上面,远指针没有规格化,这样如果两个指针实际上指向同一个物理地址,但是它们的段地址和偏移地址不一样的化,在远程指针看来,它们仍然是不一样的。如23B0:0004和23A1:00F4都指向同一个物理地址23604,但是如果进行指针比较的话,它们两个在远程指针看来是不一样的,但是在巨指针看来却是一样的。