強制類型轉換分為兩種情況:
情況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類型的指針來指向。
未完待續