先直接放程序吧,后面還有總結。
-------------------------------------------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型的。
進行強制類型轉換后,內存空間里面的內容是不會發生改變的,改變的是你去讀取這個內存空間時的解析方法。如果你讀取時的解析方法和你存進去時候的解析方法不一致就會導致數據錯誤(當然整形的強制類型轉換未必會出錯,只要是小的內存空間往大的內存空間里面轉,應該問題就不大)。所以,進行強制類型轉換到額時候,一定要對這個數據類型有一個清晰的認知(包括內存空間和解析方式)。