从嵌入式眼光看待C语言之数据类型01

来源:互联网 发布:蓝牙车载充电器 知乎 编辑:程序博客网 时间:2024/05/18 18:17
               =========变量和常量============    正所谓"静中有动,动中有静",常量和变量也是如此,它们之间相互依赖,相互影响,单从字面看就知道是什么意思.这里不是常量与变量的概念,而是深入的实质.    其中很多人在学到后面指针的时候经常会出现段错误,晕指针(指针恐惧者的叫法),野指针等问题,都是因为对常量和变量的理解不够深入,基础理解也不踏实.    变量    什么是变量     其值在其作用域内可以改变的量称之为变量,一个变量应该有一个名字,在内存中占据一定的存储空间,变量在使用前都有自己的地址.变量都有自己的地址.   变量依据其定义的类型,分为整型变量,字符型变量,浮点型变量,指针型变量等.变量的值可以发生改变,意味着他可以被覆盖,被写入,被覆值.   每个变量必须要有一个名字和它所在内存空间绑定

        int a=97;        char ch1='a';        char ch2=(char)a;        char *p=(char*)a;
     第一行代码:整型变量a在内存中是以97的二进制形式存放的,当使用它时,会以十进制形式表现出来.
        第二行代码:字符变量ch1的ASCII码也是以97的二进制存放的,使用时,会以字符'a'的形式表现出来.
        第三行代码:将整型变量a强制转换为字符 ,a变量里的值没有变,变的是它的类型,它里面的值还是97的二进制,它的类型变成了char,97的二进制变成char型,现出来就是字符a.
        第四行代码:声明一个字符型指针变量p,p是一个变量,它里面的值可变,它的值是整型变量a的值强制类型转换成了字符指针类型,这个时候p里面的值还是97的二进制,只不过这个97的意义已经代表了一个字符型指针,也就是一个指向地址的指针了.

由此可见:变量在内存中存放和它的值没有关系,而是和他的类型相关的.同样我们也可以得出:

一个二进制序列对于计算机本身没有什么任何意义,计算机不知道这个二进制数据是干什么的,只有具体到它的类型时或出现在合适的场合时,才能代表具体的意义.

如一串二进制数据出现在地址总线上,它代表的是一个地址.

如果该相同数据出现在数据总线上,它代表的是一个数据,所以当能我们看到一个数据时,如3.1415926,不能把它带上定向思维的帽子认为它就是PI,而是要看清它的本质.它就是一堆二进制代码.

     下面分析几个常见的几个例子

        char ch='a';        int a=(int)ch;        printf("%d %c\n",a,ch);
ch是什么,ch里装的什么,a是什么,a里面装的是什么?打印结果是什么?
ch是字符型变量,ch里是字符'a'的二进制二进制数,a是整型变量,a里面是字符'a'的二进制整型表示方式,以十进制数表示出来是97,打印结果为97和a.

    int add=0x12345678;    int *p=(int *)add;

   add是什么?add里装的是什么?p是什么?p里装的是什么 *p又是什么?&p又是什么?
    测试对整型和地址类型转换.add是一个整型变量,add里是0x12345678的二进制数,以十进制表示出来,p是一个整型指针变量名,p里面是0x12345678的二进制数,以地址的方式表现出来,代表地址0x12345678.*p是通过*访问地址0x12345678这个地址处的数据(如果你去打印他,可能会出错,因为这个地址我们不一定有权限访问).&p是取出整数型指针变量p的地址,因为p是一个变量,他也有自己的地址,所以可以取出它的地址来 .

    #define PI 3.14    int a=PI;    PI=3.1415926    int b=PI;    printf("%d %d\n",a,b);
 上面代码有无问题?
   PI=3.1415926会出错,PI是个常量被其替换成"3.14=3.1415926",3.14是个字面常量,不能被赋值.错误信息为(向无效左值赋值出错)
   char *str="hello world";   *str="GG!"; 
 *str="GG"出错,因为第一行将字符串常量"hello world"的首地址给了字符指针str,第二行试图将"GG"的首地址,通过*str的访问方式覆盖str指向的字符串常量"hello world"这句话理解起来比较费劲,详细说因为有两个错误
   ①试图向常量里写数据."hello world"是字符串常量,那么这个字符串空间里的内容不能改变.
   ②指针变量里应该放地址,字符串都是以首地址为地址.向一个地址里写入字符串 使用strcpy.*str只是代表了str指向的字符串的第一个字符,将字符串地址写入到字符里肯定不行.

0 0
原创粉丝点击