熟悉程式設計的通常會用到一些lp開頭的資料型別來定義指標,比如以下vs裡minwindef.h中的部分內容:
typedef
unsigned
long dword;
typedef
int bool;
typedef
unsigned
char byte;
typedef
unsigned
short word;
typedef
float float;
typedef float *pfloat;
typedef bool near *pbool;
typedef bool far *lpbool;
typedef byte near *pbyte;
typedef byte far *lpbyte;
typedef
int near *pint;
typedef
int far *lpint;
typedef word near *pword;
typedef word far *lpword;
typedef
long far *lplong;
typedef dword near *pdword;
typedef dword far *lpdword;
typedef
void far *lpvoid;
typedef const void far *lpcvoid;
其中有用到near和far,簡單來看分別是定義短指標和長(l)指標。可以驗證typedef時用near修飾指標長度是far修飾指標長度的一半。由於以前沒看見過,就好奇查了查,總結了以下結果:
near和far是在定義近指標、遠指標需要用到的,是16位cpu造就的怪胎;
現在的32位以上的cpu已經沒有這種形式了。
16位cpu(主要指80386和80486)內部陣列匯流排為16位,位址匯流排為24位。這就意味著乙個字(16bit)存不下乙個位址,要用到兩個字。習慣把高位字稱為段位址,低位字稱為偏移位址。
程式執行時,os會給程式分配幾個記憶體段供程式使用,主要的有**段(cs)、資料段(ds)、堆疊段(ss)。根據不同的編譯模式這幾個段可能重合。
當指標指向的位址與資料段的段位址相同(即處於資料段內),這時可以不記錄段位址而僅記錄偏移位址(只需16bit)。這種指標稱為近指標(near指標)。
當指標指向的位址與資料段的段位址不同(即處於資料段外),這裡不僅要記錄偏移位址還要記錄段位址(共需32bit)。這種指標稱為遠指標(far指標)。
C C 中near和far的區別
c 中far,near區別 雪后de陽光 c c 中near和far的區別 關鍵字near 和far 受目標計算機體系結構的影響。目前程式設計中使用不多。near 關鍵字建立乙個指向可定址記憶體低端部分的目標指標。這些指標占用記憶體的單一位元組,並且他們能夠指向的記憶體單元被限制到 256個位置,通...
C C 中near和far的區別
c c 中near和far的區別 關鍵字near 和far 受目標計算機體系結構的影響。目前程式設計中使用不多。near 關鍵字建立乙個指向可定址記憶體低端部分的目標指標。這些指標占用記憶體的單一位元組,並且他們能夠指向的記憶體單元被限制到 256個位置,通常是在0x0000 0x00ff範圍中。i...
C C 中near和far的區別
關鍵字near和far受目標計算機體系結構的影響。目前程式設計中使用不多。near關鍵字建立乙個指向可定址記憶體低端部分的目標指標。這些指標占用記憶體的單一位元組,並且他們能夠指向的記憶體單元被限制到256個位置,通常是在 0x0000 0x00ff範圍中。int near ptr far關鍵字建立...