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

來源:互聯網
上載者:User

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

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

 

未完待續

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.