intptr_t、uintptr_r變量類型用於保證不同機器字長(16位、32位、64位)整數與指針相互轉移的的通用性。
在這里可能會有人發出疑問:long int在32位機器上是32位,在64位機器上是64位,直接用long int不就可以避免不同機器的之間指針長度的差異了嗎?下面給出合理的解釋:
先給出不同的數據類型在不同字長機器上長度大小
可以看到,對於32位和64位機器而言,long int確實可以避免,因為和指針的長度一直保持一致,但是對於16位機器而言卻不再適用。因為在16位機器下long int不是2個字節,而是4個字節。
然后我們可以再看intptr_t和uintptr_t的定義:
/* Types for `void *' pointers. */
#if __WORDSIZE == 64 # ifndef __intptr_t_defined typedef long int intptr_t; # define __intptr_t_defined # endif typedef unsigned long int uintptr_t; #else # ifndef __intptr_t_defined typedef int intptr_t; # define __intptr_t_defined # endif typedef unsigned int uintptr_t; #endif
上面的定義在linux下的/usr/include/stdint.h中可以找到,通過定義可以發現,在64位機器下intptr_t為long int,而對於非64位的機器,即32位和16位機器,intptr_t被定義為int(unitptr_t同理),可以很好的保證intptr_t的長度與機器的指針長度一致,因此在進行整數與 指針的相互轉換時可以用intptr_t進行過渡。正如注釋 /* Types for `void *' pointers. */ 所言。