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

    未完待续

  • 相关阅读:
    java socket解析和发送二进制报文工具(附java和C++转化问题)
    hibernate缓存机制(二级缓存)
    Spring MVC中前后台数据传输小结
    NUC972 MDK NON-OS
    代码是如何控制硬件的?
    C语言位运算+实例讲解(转)
    C语言程序真正的启动函数
    51单片机的时钟及总线时序和总线扩展
    如何通过Keil将程序正确的下载进flash中
    说说M451例程讲解之串口
  • 原文地址:https://www.cnblogs.com/silentjesse/p/2799546.html
Copyright © 2011-2022 走看看