前幾天在判斷「值相同的兩個指標所指向的變數的值可以不同」
一些用到的
開始之前,先來複習一些會用到的知識。
1.位址,位元組,位
位(bit)是電子計算機中最小的資料單位。每一位的狀態只能是0或1。
位元組(byte)是用於計量儲存容量的一種單位,每乙個位元組由8位組成(1byte = 8bit)。
位址可以理解為在一片記憶體中,每個位元組(byte)的編號。
他們在記憶體中的關係可以比作,記憶體是一棟大樓,位元組(byte)是大樓中的每一層,位址是樓層編號,位(bit)是每一層中的房間,每一層有8個房間。
2.變數的記憶體
編譯器根據變數的型別,在記憶體中申請一塊空間。例如32位與64位中 int 型別申請到4位元組的空間,可理解為編譯器申請了4層樓,作為」辦公區域「。
3.指標變數
指標是指程式資料在記憶體中的位址。在c語言當中,允許用乙個變數來存放指標,這種變數稱為指標變數。
指標變數型別的作用
1 int a;以上程式中,」&「操作符取出了變數 a 在記憶體空間中的首位址,而後通過 「 * 」 操作符取出首位址所在記憶體空間的資料。2 int *p;
3 p = &a;
4 printf("%p %d\n",p,*p);
前面我們提到,儲存變數的記憶體,是由多個位元組組成。而指標變數在只知道首位址(第乙個位元組的位址)的情況下,就能找到a的記憶體區域。它是怎麼做到的?先來看看指標變數的宣告。
我們在宣告乙個指標變數的時候,會根據它將要指向的變數型別,宣告對應的型別,例如:
1 int a;不管是什麼型別的指標變數,所存的值都是位址(int型別的值)。那麼宣告不同型別的作用是什麼?答案是規定指標在記憶體中每次移動的位元組數。2 long b;
3 char c;
4 5 int *pa = &a;
6 long *pb = &b;
7 char *pc = &c;
例如定義「int *pa = &a」,取值時,int型別佔4個位元組,指標就從首位址開始移動,讀取4個位元組。同理,short型別佔2位元組,指標就移動2位元組。通過宣告指標型別,告訴指標每次移動多少位元組,來獲取變數的值。
值相同的兩個指標所指向的變數的值可以不同
「值相同的兩個指標變數」,意思是兩個指標變數指向同乙個首位址。但是如果指標變數的型別不同,因為指標移動的位元組數量不同,就可能讀取出不同的資料。
要實現不同型別指標變數指向同乙個位址,需要使用指標型別轉換。
1 short a = 1;以上例子將乙個每次移動讀取2位元組的 short 型別指標變數,轉化為乙個每次讀取4位元組的int型指標變數。2 short *p1 = &a;
3 int *p2 = (int *)p1;
4 printf("%d %d",*p1,*p2);
接下來,我們通過指標型別轉換,用同乙個首位址,取出不同的值。
1 #include 2 int main()對應結果為:3 14
p1指向:000000000062fe30
p2指向:000000000062fe30
p1取出:1
p2取出:65537
根據二進位制轉換得,10000000000000001 為 65537。由此可驗證強制轉換前指標讀取2位元組,轉化後讀取4位元組。兩個指標指向的首位址相同,但是讀出了不同的結果。
關於指標型別和指標型別轉換的理解
前幾天在判斷 值相同的兩個指標所指向的變數的值可以不同 一些用到的 開始之前,先來複習一些會用到的知識。1.位址,位元組,位 位 bit 是電子計算機中最小的資料單位。每一位的狀態只能是0或1。位元組 byte 是用於計量儲存容量的一種單位,每乙個位元組由8位組成 1byte 8bit 位址可以理解...
指標型別轉換
當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦 值號的右邊是乙個指標表示式。在我們前面所舉的例子中,絕大多數情況下,指 針的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向 的型別是一樣的。例十四 1。float f 12.3 2。float fptr f 3。...
指標型別轉換
指標型別轉換 當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦值號的右邊是乙個指標表示式。在我們前面所舉的例子中,絕大多數情況下,指標的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向的型別是一樣的。例十四 1 float f 12.3 2 float fptr ...