該系列文章源於《深刻理解C指針》的閱讀與理解,因爲本人的見識和知識的欠缺可能有誤,還望你們批評指教。數組
若是考慮到程序的可移植性和跨平臺性時,指針長度就是一個問題,須要慎重處理。通常狀況下,數據指針的長度時同樣的,與指針類型無關,void型指針、char型指針、結構體指針等通通是同樣的,函數指針的長度通常與數據指針長度不一樣。指針長度與CPU有關,嚴格意義上說與OS到底是32位仍是64位有關,同時不一樣的編譯器分配內存時,長度也是不同的。與指針相關的四種預約義類型以下:安全
1、size_t:用於安全表示長度,全部平臺和系統都會解析成本身對應的長度函數
一、定義:size_t類型表示C中任何對象所能表示的最大長度,是個無符號整數;經常定義在stdio.h或stdlib.h中spa
二、特徵:指針
1)、提供一種可移植的方式來聲明與系統中可尋址的內存區域一致的長度code
2)、用做sizeof操做符的返回值的類型對象
3)、用做內存相關函數malloc()和strlen()的參數類型blog
4)、經常使用來聲明字符個數、循環計數、數組索引的長度索引
5)、能夠用在指針的算術運算上內存
三、應用:
1)、打印是佔位符是%zu,也能夠是%u、%lu
2)、不要將負數賦值給size_t類型,必定要賦值整數才行
3)、對指針使用sizeof運算獲取指針長度
代碼以下:
1 #include <stdio.h> 2 3 int main(int argc, char **argv) 4 { 5 size_t sVar1 = -5; 6 size_t sVar2 = 9; 7 printf("sVar1: %d and sVar2: %d\n", sVar1, sVar2); 8 printf("sVar1: %zu and sVar2: %zu\n", sVar1, sVar2); 9 10 int iVar1 = 19; 11 char chVar1 = 'A'; 12 int *ptrVar1 = &iVar1; 13 char *ptrCh = &chVar1; 14 printf("iVar value %d and *ptrVar1 value %d\n", iVar1, *ptrVar1); 15 printf("iVar address %p and *ptrVar1 address %p\n", &iVar1, ptrVar1); 16 printf("chVar1 value %c and *ptrCh value %c\n", chVar1, *ptrCh); 17 printf("chVar1 address %p and *ptrCh address %p\n", &chVar1, ptrCh); 18 printf("*ptrVar1 length %d and *ptrCh length %d\n", sizeof(ptrVar1), sizeof(ptrCh)); 19 20 return 0; 21 }
代碼結果:
sVar1: -5 and sVar2: 9 sVar1: 18446744073709551611 and sVar2: 9 iVar value 19 and *ptrVar1 value 19 iVar address 0x7ffc32ae218c and *ptrVar1 address 0x7ffc32ae218c chVar1 value A and *ptrCh value A chVar1 address 0x7ffc32ae218b and *ptrCh address 0x7ffc32ae218b *ptrVar1 length 8 and *ptrCh length 8
經過代碼很容易發現指針長度都是同樣的,與指針類型沒有關係。
2、ptrdiff_t:用於處理指針算術運算,主要是表示兩個指針差值的可移植方式
3、intptr_t:用於存儲指針地址,主要存放指針地址,提供了一種可移植且安全的方法聲明指針,且時刻與系統使用指針長度相同
4、unitptr_t:用於存儲指針地址,是上邊的無符號版本,功能基本同樣,將指針轉換成整數很是方便有用