• 指针与强制类型转换


    指针与强制类型转换
    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*再去访问绝对会出错。

  • 相关阅读:
    第十四章 构建自定义的同步工具(待续)
    第十三章 显示锁(待续)
    第十二章 并发程序的测试(待续)
    第十一章 性能与可伸缩性(待续)
    第十章 避免活跃性危险(待续)
    第九章 图形用户界面的并行化(待续)
    第八章 线程池的使用(待续)
    第七章 取消与关闭(待续)
    NOIp 2015真题模拟赛 By cellur925
    [USACO10MAR]伟大的奶牛聚集Great Cow Gat…【树形dp】By cellur925
  • 原文地址:https://www.cnblogs.com/jiangtongxue/p/11371455.html
Copyright © 2020-2023  润新知