c語言的指針 強制類型轉換


強制類型轉換分為兩種情況:

情況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類型的指針來指向。

 

未完待續


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM