該系列文章源於《深入理解C指針》的閱讀與理解,由於本人的見識和知識的欠缺可能有誤,還望大家批評指教。
如果考慮到程序的可移植性和跨平台性時,指針長度就是一個問題,需要慎重處理。一般情況下,數據指針的長度時一樣的,與指針類型無關,void型指針、char型指針、結構體指針等統統是一樣的,函數指針的長度一般與數據指針長度不同。指針長度與CPU有關,嚴格意義上說與OS究竟是32位還是64位有關,同時不同的編譯器分配內存時,長度也是不一樣的。與指針相關的四種預定義類型如下:
一、size_t:用於安全表示長度,所有平台和系統都會解析成自己對應的長度
1、定義:size_t類型表示C中任何對象所能表示的最大長度,是個無符號整數;常常定義在stdio.h或stdlib.h中
2、特征:
1)、提供一種可移植的方式來聲明與系統中可尋址的內存區域一致的長度
2)、用作sizeof操作符的返回值的類型
3)、用作內存相關函數malloc()和strlen()的參數類型
4)、常用來聲明字符個數、循環計數、數組索引的長度
5)、可以用在指針的算術運算上
3、應用:
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
通過代碼很容易發現指針長度都是一樣的,與指針類型沒有關系。
二、ptrdiff_t:用於處理指針算術運算,主要是表示兩個指針差值的可移植方式
三、intptr_t:用於存儲指針地址,主要存放指針地址,提供了一種可移植且安全的方法聲明指針,且時刻與系統使用指針長度相同
四、unitptr_t:用於存儲指針地址,是上邊的無符號版本,功能基本一樣,將指針轉換成整數非常方便有用