1.三種存儲屬性的指針:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
C語言的指針有三種存儲屬性,分別是:
near (近)指針:16位段內偏移地址
far(遠)指針:16位段地址*2的4次方+16位段內偏移地址
huge(巨)指針:32位規格化的具有唯一性的內存地址
C語言的存貯屬性由六種編譯模式決定(參見TC集成環境菜單中的option->compiler->model選項),默認的編譯模式爲small, 在該編譯模式下,指針的默認屬性爲near。
在80286以前的微處理器(CPU)組成的確16位機上,Windows操作系統(包括DOS)對於內存是分段使用的(分段內存模式,Segment Memory Mode)。運行在這些16位CPU微機上的Windows(Windows 1.0-3.1)被稱爲“Win<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />16”。從80386開始的32位CPU開始,爲了兼容,也採用上述分段內存模式,這就導致了near(short)、far(long)指針的出現。
從Windows 95開始的32位機上,Windows支持32位平面內存模式(與“分段內存模式”區別),相應地,Windows 95以後的Windows也就是我們常說的“Win32”。爲Win32寫的程序使用32位的線性地址空間。
由此可見,如果你想寫在Win16上也能運行的程序,纔會涉及到newr、far指針的概念。在Win32上,指針無near、far的區分。
2.near指針和far指針的區別
在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。
在DOS下,如果沒有指定一個指針是near或far,那麼默認是near。所以far指針要顯式指定。far指針工作起來要慢一些,因爲每次訪問一個far指針時,都要將數據段或程序段的數據交換出來。另外,far指針的運算也比較反常,例如上面講到的far指針指向同一個地址,但是比較的結果卻不相同。
在Win32的保護模式和v86模式都默認的是far指針。
3.什麼時候使用far指針?
當使用小代碼或小數據存儲模式(small)時,不能編譯一個有很多代碼或數據的程序。因爲在64K的一個段中,不能放下所有的代碼與數據。爲了解決這個問題,需要指定以far函數或far指針來使用這部分的空間(64K以外的空間)。
許多庫函數就是顯式地指定爲far函數的形式。far指針通常和farmalloc()這樣的內存分配函數一起使用。
[來源] http://zhidao.baidu.com/question/50175940.html?si=1 , 彪彪小澤 http://topic.csdn.net/t/20050310/22/3841623.html,pcboyxhy