指针与强制类型转换
1、变量的数据类型的含义
(1)、所有的类型的数据存储在内存中,都是按照二进制格式存储的。所以内存中只有0和1,不知道是int的还是float的
或者是其它类型的。
(2)、int、char、short等属于整形,他们的存储方式(数据转换成二进制往内存中放的方式)是相同的,只是内存格子
的大小不同而已(所以这几种整形就彼此叫二进制兼容格式);而float和double的存储方式彼此不同,和整形更不同。
(3)、int a = 5;编译器给a分配4字节空间,并且将5按照int类型的存储方式转成二进制存到a所对应的内存空间中去(a
做左值的);我们printf去打印a的时候(a此时做右值),printf内部的vsprintf会按照格式化字符串(就是printf传参
的第一个字符串中的%d之类的东西)所代表的类型去解析a所对应的内存空间,解析出来的值用来输出。也就是说,存进去
时是按照这个变量本身的数据类型来存储的(譬如本例中a为int,所以按照int格式来存储);但是取出来时是按照printf
中%d之类的格式化字符串的格式来提取的。此时虽然a所代表的内存空间中的二进制序列(比如101010并没有改变),但是
怎么理解(怎么把这些二进制数转换成数字)就不一定了。譬如我们用%d来解析,那么还是按照int格式解析,那么值自然
是5;但是如果用%f来解析,则printf就以为a所对应的内存空间存储的是一个float类型的数,会按照float类型来解析,值
自然就会是一个很奇怪的数字了。
总结:C语言中的数据类型的本质,就是决定了这个数在内存中怎么存储的问题,也就是决定了这个数如何转换成二进制的
问题。一定要记住的一点就是内存只是存储了这些二进制数字1和0,而不管怎么解析这些数字。
2、分析几个题目:
(1)、按照int类型存却按照float类型取 一定会出错
(2)、按照int类型存却按照char类型取 有可能出错也有可能不出错
(3)、按照short类型存却按照int类型取 有可能出错也有可能不出错
(4)、按照float类型存却按照double类型取 一定会出错
3、指针的数据类型的含义
(1)、指针的本质是:变量,指针就是指针变量
(2)、一个指针涉及2个变量:一个是指针变量自己本身,一个是指针变量指向的那个变量
(3)、int *p; 定义指针变量时,p(指针变量本身)是int *类型,*p(指针指向的那个变量)是int类型的。
(4)、int *说白了就是指针类型,只要是指针类型就是占4字节,解析方式都是按照地址的方式来解析(意思就是里面存
的32个二进制加起来表示一个内存地址)的。结论就是:所有的指针类型(不管是int*还是char*还是double*)的解析方式
是相同的,都是地址。
(5)、对于指针所指向的那个变量来说,指针的类型就很重要了,指针所指向的那个变量的类型(它所对应的内存空间的
解析方法)要取决于指针类型。譬如指针是int * 的,那么指针所指向的变量就是int类型的。
4、指针数据类型转换实例分析
(1)、int和char类型都是整形,类型是兼容的。所以互转的时候有时候是错的,有时候是对的。
(2)、int和char的不同在于char只有一个字节而int有四个字节,所以int的范围比char大。也就是说在char范围内int和
char是可以互转的,不会出错,但是超出了char的范围就会出错了。
(3)、int和float的解析方式是不兼容的,所以int*转成float*再去访问绝对会出错。
|