intptr_t 和uintptr_t 類型用來存放指針地址何缓。它們提供了一種可移植且安全的方法聲明指針沃疮,而且和系統(tǒng)中使用的指針長度相同,對于把指針轉(zhuǎn)化成整數(shù)形式來說很有用今野。
intptr_t是為了跨平臺牙寞,其長度總是所在平臺的位數(shù)饺鹃,所以用來存放地址。
uintptr_t 是intptr_t 的無符號版本间雀。對于大部分操作悔详,用intptr_t 比較好。uintptr_t 不像intptr_t 那樣靈活惹挟。下面的例子說明如何使用intptr_t:
int num;
intptr_t *pi = #
如果像下面那樣試圖把整數(shù)地址賦給uintptr_t 類型的指針茄螃,我們會得到一個語法錯誤:
uintptr_t *pu = #
錯誤看起來是這樣的:
error: invalid conversion from 'int*' to
'uintptr_t* {aka unsigned int*}' [-fpermissive]
不過,用強制類型轉(zhuǎn)換來賦值是可以的:
intptr_t *pi = #
uintptr_t *pu = (uintptr_t*)#
如果不轉(zhuǎn)換類型连锯,不能將uintptr_t 用于其他類型:
char c;
uintptr_t *pc = (uintptr_t*)&c;
當(dāng)可移植性和安全性變得重要時归苍,就應(yīng)該使用這些類型。不過运怖,為簡單起見拼弃,我們的例子中不會使用。
避免把指針轉(zhuǎn)換成整數(shù)摇展。如果指針是64 位吻氧,整數(shù)只有4 字節(jié)時就會丟失信息。
早期的Intel 處理器采用16 位的分段架構(gòu)咏连,近指針和遠指針也是相對的盯孙。今天的虛擬內(nèi)存架構(gòu)上就不是這樣了。遠指針和近指針是C 標(biāo)準(zhǔn)的擴展祟滴, 用來支持早期的Intel 處理器的分段架構(gòu)振惰。近指針一次只能尋址64 KB 的內(nèi)存。遠指針最多可以尋址1 MB 內(nèi)存垄懂,但是比近指針慢骑晶。巨指針是規(guī)范化過的遠指針痛垛,使用盡可能高的段。