c言語のポインタ強制タイプ変換
2756 ワード
強制タイプ変換は、次の2つのケースに分けられます.
ケース1、mallocでメモリを割り当てる場合
次のようになります.
2、ある種類を指す既知のポインタを他の種類のポインタに変換する
次のようになります.
以上が2種類のポインタタイプ強制変換です
赤い字の疑問、test 2ポインタ変数のTest 2から強制的にTest 1に変換して、どうして成功することができますか?
実際、この考え自体が間違っている「test 2ポインタ変数をTest 2によって強制的にTest 1に変換する」ということです.
「ポインタタイプの強制変換」は事実上、誤った考えである.ポインタにはタイプ強制変換はありません.
ここでは実際にポインタが何なのか分からない.
ポインタは4つの部分を明らかにします:ポインタ自体はどんなタイプで、ポインタが指すタイプは何で、ポインタ自体の値はいくらで、ポインタが指すアドレスはいくらですか?
ケース1:
ケース2:
((Test1*)test2)->test0 = &test0;
このコードはどのように実行できますか?
なぜならtest 2はTest 2タイプのメモリ領域のヘッダアドレスを指し、Test 2の最初のメンバーtest 1はTest 1タイプであるため、実際にはこのヘッダアドレスもtest 1のヘッダアドレスである
したがってtest 2は、test 2の指向するヘッダアドレスをtest 1タイプのポインタで指向することができる.
未完待機
ケース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タイプのポインタで指向することができる.
未完待機