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类型的指针来指向。

未完待续

原文地址:https://www.cnblogs.com/silentjesse/p/2799546.html