[C]基础知识

    xiaoxiao2021-03-25  159

    C语言基础知识

    数据类型

    C语言中的数据类型如下表所示:

    数据类型

    关键字

    变量占用内存

    基本类型

    数值类型

    整型

    短整形

    short

    2 byte

    整形

    int

    4 byte

    长整形

    long

    4 byte

    浮点型

    单精度

    float

    4 byte

    双精度

    double

    8 byte

    字符类型

    char

    1 byte

    构造类型

    数组

     

     

    结构体

    struct

    不小于成员变量所占内存之和

    共用体

    union

     

    枚举类型

    enum

     

    指针类型

     

     

    空类型

    void

     

     

        数组是由一组相同类型的数据组织在一起。当我们需要不同类型的数据组织在一起时,就需要用结构体来存放不同类型或者相同类型的数据。结构体的定义格式如下:

    struct resume{

    char *name;

    int ID;

    int age;

    float score;

    };

        共用体也是包换多个相同或不同类型的复杂类型,和结构体很相似,定义格式也很相近:

    union MyUnion

    {

    float score;

    char degree;

    };

    共用体MyUnion的成员为scoredegree

     结构体和共体的区别是:结构体的各个成员分别有自己的一块内存,互相独立,互不影响;而共同体则是所有的成员共同使用同一块内存,这一块内存大小等于共同体所有成员中,占用内存最多的那个成员的内存消耗,成员之间的值互相牵制影响,修改一种某个成员的值会影响其他成员的值。如下所示,共同体teacher占据的内存为成员变量score占据的内存4byte,且每次修改teacher.score或者teacher.degree都会影响另一个成员的值。

    所以结构体变量占用的内存不小于所有成员占据内存空间之和,而共用体占用的内存等于最消耗内存的成员变量的大小。共用体采用的是内存覆盖技术,任意时刻都只能保存一个成员变量的值,当修改另一个成员变量的数值时,当前成员变量的数值被覆盖。其中共用体的成员之间在数值覆盖过程中如何相互影响,还和机器的存储方式(大端、小端)相关。

    那么共同体有什么用处呢。假设有两个类别,我们需要用构造类型来表示它们。如果这两个类别的大部分属性的类型是相同的,只有相对很少的属性的类型不同,那么如果用结构体,就需要创建两个结构体模板。此时可以用包含共同体的一个结构体来表示这两个类别,共同体的作用就是根据类别特性,对类别的某些属性选择性得表达。

    我们可以理解为:共用体的存在使得开发的工作量降低,同时便于使用者。本来需要几个接口的数据格式,经由共同体,只许一个接口就可以完成。

    还有一些需要注意的问题

    可把数据类型想象成具备固定格式的模子;

    C中的数据类型占据的内存可能会因操作系统的不同而有所差异,为保障正确性,可用sizeof检验一下;

    结构体是一个数据类型,它就像模子,是不占用内存空间的,只有用结构体这个模子创建的架构体变量包含了成员变量,才是需要内存空间的。

    内存对齐对结构体或共用体成员地址的影响

        在编译器的实现中,结构体成员之间可能会有空隙,这是由于C语言的内存对齐机制。操作系统在进行内存访问时,每次读取的长度为对齐系数,在32位操作系统中,默认对齐系数为32bit。倘若没有进行内存对齐,那么可能会出现操作系统只是想访问一个2字节的整形,却需要进行2次访问,如下图所示:

    Int1

    Char1

    Int2

    Int2

    Int3

    Int4

     

        当需要访问Int2的值时,需要进行2次寻址,降低寻址效率。

        为提升寻址效率,需要进行内存的自然对齐:每一种数据类型都必须放在地址中的整数倍上。在这个规则的限制下,不同变量之间肯定会存在很多碎片。

     在内存分配上,还有另外2个规则:

    1、结构体或共用体的第一个成员的要放在offset0的地方,而其他成员则是根据成员类型放到对应的整数倍的地址上;

    2、倘若结构体内部还有结构体,则内部的结构体的成员变量的地址应该是此结构体内的最大长度的成员变量的长度的整数倍。

    循环结构

    C中,实现循环结构的几种方式:forwhiledo-whilegoto语句

    循环结构很常用,这里只说几点需要注意的:

    循环体可以不用{}括起来,前提条件是循环体只有一句;

    Do-while循环中,循环体至少被执行一次;

    For循环(循环变量赋初值;循环条件;循环变量增量)中,括号内的三个表达式是可以缺省的,相当于while1)语句;

    while循环和do-while循环时,不要忘记在循环语句之前进行循环变量初始化的操作;

    Goto语句为强制转移语句,在多层嵌套需要退出时,使用goto语句简单粗暴,但是在很多时候,goto语句会扰乱程序中由缩进和{}所构建的层次结构,降低程序的可读性,所以很不建议使用goto语句;

    Breakcontinue语句在循环结构中使用时,前者是跳出本层循环,后者是跳过循环中continue关键词之后的语句而继续执行本层循环结构的下一次循环。两者都可以通过与if语句结合,达到程序加速的目的。

     
    转载请注明原文地址: https://ju.6miu.com/read-2782.html

    最新回复(0)