強制類型轉換分為兩種情況:
情況1、用malloc分配記憶體時
如:
Test2 *test2 = (Test2 *)malloc(sizeof(Test2));
2、將一個已知指向某類型的指標轉換成其他類型的指標
如:
typedef struct Test0{ int a ; //int c;} Test0;typedef struct Test1{ Test0 *test0;} Test1;typedef struct Test2{ Test1 test1;//執行通過 int b; int a; //Test1 test1;//執行無法通過} Test2;void main(){ Test2 *test2 = (Test2 *)malloc(sizeof(Test2)); Test0 test0; test0.a = 111;
//下面的這句為什麼會執行成功呢? ((Test1*)test2)->test0 = &test0; cout << test2->test1.test0->a << endl; }
以上就是兩種類型的指標類型強制轉換
紅色字的疑問,將test2指標變數的由Test2強制轉換為Test1,為什麼可以成功呢?
事實上這種想法本身就是錯的"將test2指標變數的由Test2強制轉換為Test1",
"指標類型的強制轉換"事實上本身就是一種錯誤的想法.在指標是沒有類型強制轉換的.
這裡事實上就是沒弄清什麼是指標
指標要弄清四部分:指標本身是什麼類型、指標所指向的類型是什麼、指標本身的值是多少、指標所指向的地址存的值是多少?
情況1:
Test2 *test2 = (Test2 *)malloc(sizeof(Test2));
這裡要這麼理解 test2是一個Test2*類型的指標變數,,而malloc(sizeof(Test2))返回的是一個void*類型的記憶體區的首地址,
那麼這個記憶體區要由Test2類型的指標來指向,那他當然要把這個首地址開始的某地區轉換成Test2類型,以讓test2進行操作
情況2:
((Test1*)test2)->test0 = &test0;
這個代碼是如何能執行呢?
原因是test2指向的是一種Test2類型的記憶體區的首地址,而Test2的第一個成員test1是Test1類型的,所以事實上該首地址事實上也是test1的首地址
所以test2可以把test2的所指向的首地址由test1類型的指標來指向。
未完待續