zoukankan      html  css  js  c++  java
  • 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类型的指针来指向。

    未完待续

  • 相关阅读:
    迭代器和生成器
    装饰器
    函数进阶二
    函数进阶
    函数的初识
    python基础七
    python基础六
    python基础五
    python基础四
    python2与python3的区别
  • 原文地址:https://www.cnblogs.com/silentjesse/p/2799546.html
Copyright © 2011-2022 走看看