指標強制型別轉換的理解

2021-10-10 04:33:18 字數 1721 閱讀 4683

**:

指標強制型別轉換的理解

一些用到的

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

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;

45 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

2 int main()

3 複製**

對應結果為:

p1指向:000000000062fe30

p2指向:000000000062fe30

p1取出:1

p2取出:65537

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

指標強制型別轉換的理解

前幾天在判斷 值相同的兩個指標所指向的變數的值可以不同 這句話時,發現自己對指標型別一些概念僅僅是記住了結論。於是查閱了一些資料,記錄一下一些與指標型別和指標型別轉化相關的知識。一些用到的開始之前,先來複習一些會用到的知識。1.位址,位元組,位 位 bit 是電子計算機中最小的資料單位。每一位的狀態...

指標強制型別轉換

當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦值號的右邊是乙個指標表示式。在我們前面所舉的例子中,絕大多數情況下,指標的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向的型別是一樣的。例十四 1。float f 12.3 2。float fptr f 3。int...

指標型別強制轉換

問題為下 include void main 輸出為啥不是1呢 這個時候,我們可以看到函式式裡面有格式的轉換,如果格式轉換時存在除void格式外,還有兩個及兩個以上的格式的轉換,則這時候的指標所指的variable所佔的記憶體會產生變化,從而會使格式發生相應的變化 對於本題 當你強行將int指標變為...