天天看點

07深入了解C指針之---指針類型和長度

深入了解C指針之---指針類型和長度

  該系列文章源于《深入了解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      

  通過代碼很容易發現指針長度都是一樣的,與指針類型沒有關系。

人就像是被蒙着眼推磨的驢子,生活就像一條鞭子;當鞭子抽到你背上時,你就隻能一直往前走,雖然連你也不知道要走到什麼時候為止,便一直這麼堅持着。