强制类型转换分为两种情况:
情况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类型的指针来指向。
未完待续