huge far near指標的說明

2021-06-07 09:23:33 字數 1253 閱讀 8738

今年金山筆試題中有一道lpword++的遞增位元組數,拿不準回來查一下,發現原來有這麼多東西在裡面,記錄一下,呵呵。

windef.h中定義了lpword我們來看一下:

typedef word near 

*pword;

typedef word far 

*lpword;

在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指標,所有在指標比較時不會產生錯誤。

也說C語言指標

值傳遞 引用傳遞 指標傳遞 位址的值 位址的引用 要改變的是指標 傳遞指標的指標 要改變的是指標指向的內容 傳遞指標,即內容的指標 給位址賦值與往位址存放資料 1 指標是乙個資料的位址,同時也是乙個資料 變數或者常量 乙個資料本身就是有位址和值,指標不過是乙個位址值資料,即乙個位址裡儲存的是另乙個值...

說一說指標中的結構體指標

之前學大一學c語言鍊錶,總遇到結構體指標。當時很不明白為什麼都要malloc申請空間。現在覺得,其實沒說是結構體就必須要分配一塊記憶體。首先,結構體和int char dobule等等一樣,也是一種資料型別,無非是有點特殊而已 struct a struct a a 在棧上分配空間 可以不mallo...

細說C (十五) 說一下this指標

this this即位隱式的指標,指向呼叫者本身 物件的位址即為this 所有的成元函式都隱式的含有乙個this指標 細節點說明 this 實際上是成員函式的乙個形參,在呼叫成員函式時將物件的位址作為實參傳遞給 this。不過 this 這個形參是隱式的,它並不出現在 中,而是在編譯階段由編譯器默默...