基本介紹
- 中文名:巨指針
- 解釋:32位的指針
- 用處:程式語言
- 類別:指針
C/C++中的指針,8086體系結構,遠近指針區別,巨指針,指針類型的統一,
C/C++中的指針
C/C++中的近指令、遠指針和巨指針
在我們的C/C++學習生涯中、在我們大腦的印象里,通常只有指針的概念,很少聽說指針還有遠、近、巨之分的,從沒聽說過什麼近指針、遠指針和巨指針。
可以,某年某月的某一天,你突然看到這樣的語句:
char near *p; /*定義一個字元型“近”指針*/
char far *p; /*定義一個字元型“遠”指針*/
char huge *p; /*定義一個字元型“巨”指針*/
實在不知道語句中的“near”、“far”、“huge”是從哪裡冒出來的,是個什麼概念!本文試圖對此進行解答,解除許多人的困惑。
8086體系結構
CS(Code Segment):代碼段暫存器;
DS(Data Segment):數據段暫存器;
SS(Stack Segment):堆疊段暫存器;
ES(Extra Segment):附加段暫存器。
因此,在16位處理器環境下,如果訪問本段內地址的值,用一個16位的指針(表示段內偏移)就可以訪問到;而要訪問本段以外地址的值,則需要用16位的段內偏移+16位的段地址,總共32位的指針。
遠近指針區別
這樣,我們就知道了遠、近指針的區別:
近指針是只能訪問本段、只包含本段偏移的、位寬為16位的指針;
char near *p;
p=(char near *)0xffff;
char far *p;
p=(char far *)0x10000002;
巨指針
除了遠指針和近指針外,還有一個巨指針的概念。
void normalize(void far ** p)
{
*p=(void far *)(((long)*p&0xffff000f)+(((long)*p&0x0000fff00<<12));
}
從上面的函式中我們再一次看到了指針之指針的使用,這個函式要修改指針的值,因此必須傳給它的指針的指針作為參數。
講到這裡,筆者要強調的是:近指針、遠指針、巨指針是段定址的16bit處理器的產物(如果處理器是16位的,但是不採用段定址的話,也不存在近指針、遠指針、巨指針的概念),當前普通PC所使用的32bit處理器(80386以上)一般運行在保護模式下的,指針都是32位的,可平滑地址,已經不分遠、近指針了。但是在嵌入式系統領域下,8086的處理器仍然有比較廣泛的市場,如AMD公司的AM186ED、AM186ER等處理器,開發這些系統的程式時,我們還是有必要弄清楚指針的定址範圍。
如果讀者還想更透徹地理解本文講解的內容,不妨再溫習一下微機原理、8086彙編,並參考C/C++高級編程書籍的相關內容。
指針類型的統一
巨指針為代表的長短不一的指針,是與16位的80x86實模式和DOS作業系統緊密聯繫在一起的。
在32位Windows作業系統中,作業系統工作在保護模式,採用32位的線性地址,所有的指針又統一成32位的指針一種類型。