C語言中的強制型別轉換
先直接放程式吧,後面還有總結。
-------------------------------------------start-----------------------------------------------
#include<stdio.h>
#include<string.h>
int main(void)
{
int a = 9;
float *p = (float *)&a;
printf("*(int *)p = %d.\n", *(int *)p);
printf("*p = %f.\n", *p); //一開始時,編譯器按照int型的儲存方式把數字9放到a變數的記憶體空間中(4位元組)
//但是強制型別轉換後,指標變數p以為自己指向的地址是一個float型別的空間,所
//以如果此時直接去解引用這個指標,則按照float型別的解析方式去解析int型別的
//記憶體空間(雖然空間也是4位元組,但是解讀裡面的二進位制資料的時候會出現錯誤。就
//好比一張紙我剛剛寫東西進去的時候寫的中文,但是你拿出來讀的時候卻非得按照英
//文來讀,紙的大小和紙上的內容是沒有變化的(都是4位元組,都是我之前寫進去的資料)
//但是你用英文來讀我的寫進去的中文,鬼知道你會讀成什麼鬼樣。
return 0;
}
--------------------------------------------end-----------------------------------------
總結:在C語言中,你定義一個變數並對其進行賦值的時候,你需要意識到,這個變數初始定義的型別就包含了兩層含義了。
第一層含義:這個資料型別表示的記憶體空間的大小
第二層含義:編譯器把我設定的數值放到這個記憶體空間是,是怎麼把我的資料解析成二進位制後再存進去這個記憶體空間的呢?是按照你說設定的
資料型別的儲存方式解析後存進去的。比如儲存方式有整形的(int, short, char )、float型 的、double型的。
進行強制型別轉換後,記憶體空間裡面的內容是不會發生改變的,改變的是你去讀取這個記憶體空間時的解析方法。如果你讀取時的解析方法
和你存進去時候的解析方法不一致就會導致資料錯誤(當然整形的強制型別轉換未必會出錯,只要是小的記憶體空間往大的記憶體空間裡面轉,應該問題就不大)。
所以,進行強制型別轉換到額時候,一定要對這個資料型別有一個清晰的認知(包括記憶體空間和解析方式)。