huge、far、near指针的说明

来源:互联网 发布:中国人长相知乎 编辑:程序博客网 时间:2024/04/28 22:41
今年金山笔试题中有一道LPWORD++的递增字节数,拿不准回来查一下,发现原来有这么多东西在里面,记录一下,呵呵。

    WINDEF.H中定义了LPWORD我们来看一下:

    typedef WORD near           *PWORD;
    typedef WORD far            *LPWORD;

而WORD是一个unsigned short类型,那么答案呼之欲出了,两个字节。但我不明白far和near有什么区别呢,只知道是寻址方式不同,继续百度之,得到了以下的解释:

    在DOS下(实模式)地址是分段的,每一段的长度为64K字节,刚好是16位(二进制的十六位)。
near指针的长度是16位的,所以可指向的地址范围是64K字节,通常说near指针的寻址范围是64K。
far指针的长度是32位,含有一个16位的基地址和16位的偏移量,将基地址乘以16后再与偏移量相加,(所以实际上far指针是20位的长度。)即可得到far指针的1M字节的偏移量。所以far指针的寻址范围是1M字节,超过了一个段64K的容量。例如一个far指针的段地址为0x7000,偏移量为0x1244,则该指针指向地址0x71224.如果一个far指针的段地址是0x7122,偏移量为0x0004,则该指针也指向地址0x71224。
    如果没有指定一个指针是near或far,那么默认是near。所以far指针要显式指定。far指针工作起来要慢一些,因为每次访问一个far指针时,都要将数据段或程序段的数据交换出来。另外,far指针的运算也比较反常,例如上面讲到的far指针指向同一个地址,但是比较的结果却不相同。

当使用小代码或小数据存储模式时,不能编译一个有很多代码或数据的程序。因为在64K的一个段中,不能放下所有的代码与数据。为了解决这个问题,需要指定以far函数或far指针来使用这部分的空间(64K以外的空间)。许多库函数就是显式地指定为far函数的形式。far指针通常和farmalloc()这样的内存分配函数一起使用。

只有巨指针才是一般C   语言教科书上所说的指针,它像远指针也  
  占4个字节。与远指针的显著差别是:当增量或减量超过64K字节段边  
  界时,巨指针会自动修正段基址的值。因此,巨指针不但可以寻址内  
  存中的任一区域,而且所寻址的数据目标可以超过64K字节。例如:  
  char   huge   *hp=(char   huge   *)0xb800ffff;  
  hp++;   在指针加1后,hp将指向C800:0000。但是,巨指针总是比较慢的,  
  因为编译必须生成一小段程序对指针进行32位而不是16位的加减运算。  
  此外,由于huge指针是规则化指针,每一个实际内存地址只一个  
  huge指针,所有在指针比较时不会产生错误。

原创粉丝点击