複製鏈接
請複製以下鏈接發送給好友

遠指針

鎖定
遠指針不是讓編譯程序把程序數據段地址作為指針的段地址部分,而是把指針的段地址與指針的偏移量直接存放在指針內。
中文名
遠指針
外文名
far pointer
位    數
32位的指針
大    小
4 個字節構成

目錄

遠指針簡介

因此,遠指針是由4 個字節構成。它可以指向內存中的任一目標,可以用於任一編譯模式,儘管僅在緊湊、大和巨模式下遠指針才是缺省的數據指針。因為遠指針的段地址在指針內,熟悉80X86 彙編語言的人都知道,這意味着每次使用遠指針時都需要重新裝載段寄存器,這顯然會降低速度

遠指針區別

近指針是16位的指針,它只表示段內的偏移地址,因而只能對64k字節數據段內地址進行存取。
如 char near *p;
p=(char near *)0xffff;
遠指針是32位指針,它表示段地址:偏移地址,如定義遠程指針p指向B500段的2號地址,即B500:0002,則可寫作:
char far *p;
p=(char far *)0xB5000002;
因此,遠指針可以進行跨段尋址,可以訪問整個內存的地址。

遠指針注意事項

儘管遠指針可以尋址內存中的任一單元,但它所尋址的目標也不能超過64K 字節。這是因為,遠指針在增量或減量之類的算術運算時,也只是偏移量部分參與運算,而段地址保持不變。因此,當遠指針增量或減量到超過64K字節段邊界時就出錯。例如: char far *fp=(char far *)0xb800ffff;fp++; 在指針加1以後,fp將指向B800:0000,而不是所希望的C800:0000。
此外,在進行指針比較時,far指針還會引起另外一些問題。far指針是由偏移量和段地址這樣一對16位數來表示的,對於某一實際內存地址,far指針不是唯一的,例如,far指針1234:0005、1230:0045、1200:0345、1000:2345、0900:9345等都是代表實際地址12345,這樣會引起許多麻煩。
第一,為了便於與“空”(NULL)指針(0000: 0000)進行比較,當
關係操作符“==”和“!=”用於對far 指針進行比較時,比較的是全
部32位。否則,如果只比較16位偏移量,那麼任何偏移量為0 的指針
都將是“空”(NULL)指針,這顯然不符合一般使用要求。但在進行這
32位比較時,不是按20位實際地址來比較,而是把段地址和偏移量當
作一個32位無符號長整數來比較。對於上面這個例子,假設這些指針
分別叫作a、b、c、d、e,儘管這5個far 指針指向的都是同一內存單
元,但下列表達式運算的結果卻都為“假”,從而得出錯誤的結論:
if(a==b)....
if(b==c)....
if(c==d)....
if(d==e)....
if(a==c)....
if(a==d)....
第二,當用“>”、“>=”,“<”和“<=”關係操作符對指針進
行比較操作時,比較的僅僅是偏移量部分,即按無符號的16位整數進
行比較。因此,對於上面這個例子,下列表達式運算的結果將都為
“真”,也得出錯誤的結論:
if(e>d)....
if(d>c)....
if(c>b)....
if(b>a)....
if(e>a)....