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....