指針強制類型轉換的理解



前幾天在判斷  值相同的兩個指針所指向的變量的值可以不同 ”  這句話時,發現自己對指針類型一些概念僅僅是記住了結論。於是查閱了一些資料,記錄一下一些與指針類型和指針類型轉化相關的知識。
 

 一些用到的

開始之前,先來復習一些會用到的知識。

1.地址,字節,位

  位(bit)是電子計算機中最小的數據單位。每一位的狀態只能是0或1。

  字節(Byte)是用於計量存儲容量的一種單位,每一個字節由8位組成(1Byte = 8bit)。

  地址可以理解為在一片內存中,每個字節(Byte)的編號。

  他們在內存中的關系可以比作,內存是一棟大樓,字節(Byte)是大樓中的每一層,地址是樓層編號,位(bit)是每一層中的房間,每一層有8個房間。

   

 

2.變量的內存

  編譯器根據變量的類型,在內存中申請一塊空間。例如32位與64位中 int 類型申請到4字節的空間,可理解為編譯器申請了4層樓,作為”辦公區域“。

3.指針變量

  指針是指程序數據在內存中的地址。在c語言當中,允許用一個變量來存放指針,這種變量稱為指針變量。

 

指針變量類型的作用

  

1 int a;
2 int *p;
3 p = &a;
4 printf("%p %d\n",p,*p);

 

  以上程序中,”&“操作符取出了變量 a 在內存空間中的首地址,而后通過 “ * ”  操作符取出首地址所在內存空間的數據。

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

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

1     int a;
2     long b;
3     char c;
4 
5     int *pa = &a;
6     long *pb = &b;
7     char *pc = &c;

  不管是什么類型的指針變量,所存的值都是地址(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 }

  對應結果為: 

    p1指向:000000000062FE30
    p2指向:000000000062FE30
    p1取出:1
    p2取出:65537

  

    

    根據二進制轉換得,10000000000000001 為 65537。由此可驗證強制轉換前指針讀取2字節,轉化后讀取4字節。兩個指針指向的首地址相同,但是讀出了不同的結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM