今年金山筆試題中有一道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 這個形參是隱式的,它並不出現在 中,而是在編譯階段由編譯器默默...