c言語のポインタ強制タイプ変換

2756 ワード

強制タイプ変換は、次の2つのケースに分けられます.
ケース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; }

 
 
以上が2種類のポインタタイプ強制変換です
赤い字の疑問、test 2ポインタ変数のTest 2から強制的にTest 1に変換して、どうして成功することができますか?
実際、この考え自体が間違っている「test 2ポインタ変数をTest 2によって強制的にTest 1に変換する」ということです.
「ポインタタイプの強制変換」は事実上、誤った考えである.ポインタにはタイプ強制変換はありません.
ここでは実際にポインタが何なのか分からない.
ポインタは4つの部分を明らかにします:ポインタ自体はどんなタイプで、ポインタが指すタイプは何で、ポインタ自体の値はいくらで、ポインタが指すアドレスはいくらですか?
 
ケース1:
Test2 *test2 = (Test2 *)malloc(sizeof(Test2));
test2 Test2* ,, malloc(sizeof(Test2)) void* ,
Test2 , Test2 , test2

ケース2:
 ((Test1*)test2)->test0 = &test0;
このコードはどのように実行できますか?
なぜならtest 2はTest 2タイプのメモリ領域のヘッダアドレスを指し、Test 2の最初のメンバーtest 1はTest 1タイプであるため、実際にはこのヘッダアドレスもtest 1のヘッダアドレスである
したがってtest 2は、test 2の指向するヘッダアドレスをtest 1タイプのポインタで指向することができる.
 
未完待機