zoukankan      html  css  js  c++  java
  • 【探究实验】数据类型——指针类型转换——输出方式的探究

    #include<stdio.h>
    
    int main(){
        //1
        int a=1;    
        printf("%d
    ",(double)a);//猜想1
        printf("%d
    ",*(double*)&a);//正常输出//猜想2+3
        printf("%d
    ",(float)a);//猜想1
        printf("%d
    ",*(float*)&a);//猜想2
        printf("
    ");
        //2
        printf("%f
    ",(double)a);//正常输出//猜想1
        printf("%f
    ",*(double*)&a);//猜想1+2
        printf("%f
    ",(float)a);//正常输出//猜想1
        printf("%f
    ",*(float*)&a);//猜想2
        printf("
    ");
        //3
        double b=1;
        printf("%f
    ",(double)b);//正常输出//猜想1
        printf("%f
    ",*(double*)&b);//正常输出//猜想1
        printf("%f
    ",(float)b);//正常输出//猜想1
        printf("%f
    ",*(float*)&b);//猜想2
        printf("
    ");
        //4
        float c=1;
        printf("%f
    ",(double)c);//正常输出//猜想1
        printf("%f
    ",*(double*)&c);//猜想2
        printf("%f
    ",(float)c);//正常输出//猜想1
        printf("%f
    ",*(float*)&c);//正常输出//猜想1
        printf("
    ");
        
        return 0;
    }

    输出结果

    0
    1
    0
    0
    
    1.000000
    0.000000
    1.000000
    0.000000
    
    1.000000
    1.000000
    1.000000
    0.000000
    
    1.000000
    0.000000
    1.000000
    1.000000

    问题1:指针类型的作用是什么?区域1中为什么转换为double类型指针的a可以输出,而转换为foalt类型指针的a不能输出?

    问题2:int a;*(double*)&a写法的临时存储方式是什么?和变量的初始定义有关系吗?为什么%d输出可以而%f不能(%lf也不能)输出?为什么*(float*)&a写法的输出两种都不能?

    猜想:

    1。%d只能输出整型,%f只能输出浮点数

    2。*(double*)&a 的写法 受且只受 强制转换 的限制:int* 和double*可以相互转换,但是float*不能和其他类型互换。

    3。*(double*)&a如果成功得到的临时变量就是a。

    猜想1在书上已经发现了,于是证明猜想2和3

    //证明猜想---int
        int test=1;
        printf("%d
    ",*(int*)&test);
        printf("%f
    ",*(int*)&test);
        printf("%d
    ",*(float*)&test); 
        printf("%f
    ",*(float*)&test);
        printf("%d
    ",*(double*)&test); 
        printf("%f
    ",*(double*)&test);
    

    结果:

    1
    0.000000
    0
    0.000000
    1
    0.007813
    //证明猜想---double
        double test=1;
        printf("%d
    ",*(int*)&test);
        printf("%f
    ",*(int*)&test);
        printf("%d
    ",*(float*)&test); 
        printf("%f
    ",*(float*)&test);
        printf("%d
    ",*(double*)&test); 
        printf("%f
    ",*(double*)&test);

    结果:

    0
    0.000000
    0
    0.000000
    0
    1.000000
    //证明猜想---float
    float test=1; printf("%d ",*(int*)&test); printf("%f ",*(int*)&test); printf("%d ",*(float*)&test); printf("%f ",*(float*)&test); printf("%d ",*(double*)&test); printf("%f ",*(double*)&test);

    结果:

    1065353216
    0.000000
    0
    1.000000
    1065353216
    0.007813

    实验结论:

    猜想2和猜想3都是错误的。

    除了int类型指针可以强制转换为double类型指针以外,int,double,float不能相互转换。

    最终结论:

    1整型和浮点数  输出类型必须与输出位的类型一致才能正常输出

    2不同指针类型相互转换写法会产生未知的错误。写法建议只用于与void*相互转换的情况。

    思考题:

    1.整型和浮点数中,为什么只有int*可以转换为double*而且*得到的还是一个int类型?其中原理是什么?

    2.test错误输出中的数字是怎么产生的?

    思考任务:

    理解指针类型与指针类型转换原理。

  • 相关阅读:
    iOS 快语句(block)浅析
    iOS中控制器的创建
    iOS中的截屏
    iOS&UITextView中的placeholder属性
    iOS归档,解档
    iOS内存警告浅析
    scrollWidth,clientWidth,offsetWidth的区别
    css3学习笔记
    页面重构的常用规范
    页面重构的职业定位
  • 原文地址:https://www.cnblogs.com/LPworld/p/11322304.html
Copyright © 2011-2022 走看看