near far huge三個指標的區別

2021-07-07 06:23:52 字數 2367 閱讀 8877

1、近(near)指標

近指標是16位指標,它只含有位址的偏移量部分,當用組合語言和c語言混合程式設計時,組合語言總是假設ds含有資料目標的位址。雖然近指標占用空間最小,執行速度最 快,

但它有乙個嚴格的限制, 即只能64k位元組以內的資料,且只能訪問程式的資料段內的資料。 如果在小模式下編譯乙個程式,而這個程式企圖增量乙個近指標使之超過第

65536

個位元組,則這個近的指標就會復位到0。

下面就是這樣乙個例子:   

char _near *p=(char _near *)0xffff;   

p++;   

由於近指標的這個嚴重限制,所有在比較大或比較複雜的程式中,都無法使用。

2、遠(far)指標

遠指標是把指標的段位址與指標的偏移量直接存放在指標內,遠指標是由4 個位元組構成。它可以指向記憶體中的任一目標,可以用於任一編譯模式,儘管僅在緊湊、大和巨模 式

下遠指標才是預設的資料指標。應該注意:儘管遠指標可以定址記憶體中的任一單元,但它所定址的目標也不能超過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)....

3 巨(huge)指標

只有巨指標才是一般c語言教科書上所說的指標,它像遠指標也佔4個位元組。與遠指標的顯著差別是:當增量或減量超過64k位元組段邊界時,巨指標會自動修正段基址的值。 因

此,巨指標不但可以定址記憶體中的任一區域,而且所定址的資料目標可以超過64k位元組。

例如:   

char huge *hp=(char huge *)0xb800ffff;   

hp++;   

在指標加1後,hp將指向c800:0000。但是,巨指標總是比較慢的,因為編譯必須生成一小段程式對指標進行32位而不是16位的加減運算。此外,由於huge指標是規則化指

針,每乙個實際記憶體位址只乙個 huge指標,所有在指標比較時不會產生錯誤。

4 基(based)指標

前面已經說過,巨指標綜合了近指標和遠指標的優點。像近指標一樣,基指標只佔兩個位元組,這兩個位元組是位址的偏移量。像遠指標一樣,基指標可以定址記憶體中的任一區

域。近指標的段位址隱含地取自程式的資料段,遠指標的段位址取自指標本身。  

5 各類指標之間的轉換   

far指標可以強制轉換為near指標,做法很簡單,拋掉段位址只保留偏移量。near指標也可以轉換為far指標,turboc的做法是從相應的段暫存器中取得段位址。

far指標有時也需要轉換為huge指標,以便對指標進行比較或做

其它操作。

一種方法是通過下面這樣乙個規則化函式:  

void normalize(void far **p)     

機器學習 三個指標

首先,來了解一下下真正例 假正例 假負例 真負例。tp,fp,fn,tn 聽著就迷迷糊糊 不過,有了下面這張圖就好理解多了 嘻嘻這是我花了二十分鐘做出來的!真正例 tp 實際值為yes 也為yes 假正例 fp 實際值為no,為yes 假負例 fn 實際值為yes,為no 真負例 tn 實際值為no...

指標使用的三個注意

int a 5 int p a 或者儲存一段連續空間的位址,如結構體的某一單元 node p node malloc sizeof person int compare int a.int b 當然指標之間也可以賦值,例如 int p a int q p 2.指標指向的物件的內容是什麼 物件的內容是...

用指標排序三個數

01.02.程式的版權和版本宣告部分 05.檔名稱 test.cpp 06.作 者 馬德鵬 07.完成日期 2013 年11月24日 08.版 本 號 v1.0 09.對任務及求解方法的描述部分 10.輸入描述 無 11.問題描述 用指標排序三個數 12.程式輸入 7 13.程式輸出 105 14....