C語言的 指針的數據類型----指針類型的思想,指針類型轉換的思想對數據處理簡化但容易出錯

存儲變量的內存,是由多個字節組成。而指針變量在只知道首地址(第一個字節的地址)的情況下,就能找到a的內存區域。它是怎麼做到的?先來看看指針變量的聲明。

  我們在聲明一個指針變量的時候,會根據它將要指向的變量類型,聲明對應的類型,例如:

 

    int a;
    long b;
    char c;

    int *pa = &a;
    long *pb = &b;
    char *pc = &c;

  不管是什麼類型的指針變量,所存的值都是地址(int類型的值)。那麼聲明不同類型的作用是什麼?答案是規定指針在內存中每次移動的字節數。

  例如定義“int *pa = &a”,取值時,int類型佔4個字節,指針就從首地址開始移動,讀取4個字節。同理,short類型佔2字節,指針就移動2字節。通過聲明指針類型,告訴指針每次移動多少字節,來獲取變量的值。

 

不管是什麼類型的指針變量,所存的值都是地址(int類型的值)。那麼聲明不同類型的作用是什麼?答案是規定指針在內存中每次移動的字節數。

  例如定義“int *pa = &a”,取值時,int類型佔4個字節,指針就從首地址開始移動,讀取4個字節。同理,short類型佔2字節,指針就移動2字節。通過聲明指針類型,告訴指針每次移動多少字節,來獲取變量的值。

 

 

 

值相同的兩個指針所指向的變量的值可以不同

  “值相同的兩個指針變量”,意思是兩個指針變量指向同一個首地址。但是如果指針變量的類型不同,因爲指針移動的字節數量不同,就可能讀取出不同的數據。

  要實現不同類型指針變量指向同一個地址,需要使用指針類型轉換。

1     short a = 1;
2     short *p1 = &a;
3     int *p2 = (int *)p1;
4     printf("%d %d",*p1,*p2);

   以上例子將一個每次移動讀取2字節的 short 類型指針變量,轉化爲一個每次讀取4字節的int型指針變量。

   接下來,我們通過指針類型轉換,用同一個首地址,取出不同的值。

複製代碼

 1 #include <stdio.h>
 2 int main()
 3 {
 4     short c[2];               //等價於申請2個連續的內存空間,每個空間2字節 
 5     c[0] = 1;                //爲第一個short空間賦值爲1 
 6     c[1] = 1;                //爲第二個short空間賦值爲1 
 7     short *p1 = c;            //p1指向c[]首地址 
 8     int *p2 = (int *)p1;      //p2指向c[]首地址,並強制轉換類型爲 int 
 9 
10     printf("p1指向:%p\np2指向:%p\n",p1,p2);      
11     printf("p1取出:%d\np2取出:%d\n",*p1,*p2);
12     return 0;
13 }
14         
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章