指针与强制类型转换

Posted sanshijvshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针与强制类型转换相关的知识,希望对你有一定的参考价值。

指针与强制类型转换

变量的数据类型的含义

(1)所有的类型的数据存储在内存中,都是按照进制格 式存储的。所以内存中只知道有0和1,不知道 是int的、还是float的还是其他类型。

(2)int、 char、short等属于整形,他们的在储方式(数转换成进制往内在中放的方式)是租同的,只是内在格子大小不同(所以这几种整型就彼此叫二进制兼容格式),而float和double的存储方式彼此不同,和整型更不同。
 
(3)inta =  5;时,编译器给a分配4字节空间,并且将5按照int类型的存储方式转成一进制存到a所对应的内存空间中去(a做左值的) ;我们printf去打印a的时候(a此时做右值),printf内部的vsprintf函数会按照格式化字符串(就是printf传参的第个字符 串参数中的%d之类的东西所代表的类型去解析a所对应的内存空间,解析出的值用来输出。也就是说,存进去时是按照这个变量本身的数据类型来存储的(譬如本例中a为int所以按照int格式来存储);但是取出来时是按照printf中%d之类的格式化字符串的格式来提取的。此时虽然a所代表的内存空间中的10101序列并没有变(内存是没被修改的)但是怎么理解(怎么把这些1010转成数字)就不一定了。譬如我们用%d来解析,那么还是按照int格式解析则值自然还是5;但是如果用%f来解析,则printf就以为a对应的内存空间中存储的是一个float类型的数,会按照float类型来解析,值自然是奇怪的一个数字了。 
 

总结: c语言中的数据类型的本质,就是决定了这个数在内存中怎么存储的问题,也就是决定了这个数如何转成二进制的问题。一定要记住的一点是内存只是存储1010的序列,而不管这些1010怎么解析。所以要求我们平时数据类型不能瞎胡乱搞。

分析几个题目:

(1) 按照int类型存却按照float类型取     一定会出错

(2) 按照int类型存却按照char类型取     有可能出错也有可能不出错大

(3) 按照short类型存却按照int类型取      有可能出错也有可能不出错

(4) 按照float类型存却按照double取                一定会出错

 

#include <stdio.h>


void main()
{
    int a = 5;
    int* p = &a;

    float* p1;

    p1 = (float* )p;

    printf("p = %f
",p); //输出奇怪的数字
    
    printf("p = %d
",p);
    printf("p = %x
",p);
    printf("p = %p
",p);
    
    
    printf("p1 = %d
",p1);//输出奇怪的数字
}

 

技术分享图片

 

 
 
 
 
 
 
 


   








以上是关于指针与强制类型转换的主要内容,如果未能解决你的问题,请参考以下文章

指针强制类型转换的理解

关于继承中的强制类型转换

C语言的多态是不是是类似于用结构指针的强制转换来实现的,具体实现方式类似于Linux万能链表???

函数的指针参数强制类型转换异常

不同类型的指针相互转换的话,需要强制类型转换

不同类型的指针相互转换的话,需要强制类型转换