huge、far、near指针的说明

今年金山笔试题中有一道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指针,所有在指针比较时不会产生错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
指针和远指针是在编程中用于访问内存中不同区域的指针类型。默认情况下,如果没有指定指针是near还是far,那么默认是near指针。近指针只占用两个字节,用于访问程序的数据段中的地址。而远指针则需要显式指定,并且在访问时需要将数据段或程序段的数据交换出来,因此运行起来比较慢。此外,远指针的运算方式也与常规指针不同,即使两个远指针指向同一个地址,比较的结果也可能不相同。\[1\] 此外,还有一种指针类型叫做基指针或based指针。基指针综合了近指针和远指针的优点,同样只占用两个字节,用于寻址内存中的任意区域。基指针的段地址取法以及其他技术和应用问题可以参考相关章节。\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [near指针far指针](https://blog.csdn.net/bluefire0215/article/details/43526767)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [nearfarhuge,based四个个指针的区别](https://blog.csdn.net/bjbz_cxy/article/details/81082642)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值