Linux & 标准C语言学习 <DAY16>

一、结构体
    结构体是由程序员自己设计的一种类型,用于描述一种事物的各种数据
    1、使用
        设计:
            struct 结构体名
            {
                类型名 成员名;
                ...
            };

            *typedef重定义结构类型:
            typedef struct 结构类型名
            {
                类型名 成员名;
                ...
            }结构类型名;

        定义:
            struct 结构体类型名 结构体变量名
            注意:C语言中在定义结构体变量时,struct关键字不能省略

        初始化:
            struct 结构体类型名 结构体变量名 = {v1,v2,v3,...};
                注意:必须根据成员的设计顺序初始化
           
            struct 结构体类型名 结构体变量名 = {.成员名1=v1,.成员名2=v2,...};
                注意:不需要按照顺序,只初始化某些成员
           
            struct 结构体类型名 结构体变量名 = 同类型结构变量;
                注意:*同类型的结构变量可以直接整体赋值

        访问成员:
            结构体变量名.成员名;

            结构体变量名->成员名;  //结构体是指针变量时
                注意:由于结构体变量一般字节数都较大,普通值传递效率低,因此一般都传递结构变量的地址,且一般存在堆内存比较合适

    2、如何计算结构体的总字节数
        结构成员的顺序可能会影响它的总字节数,如果能在设计结构体时合理安排成员顺序可以大大地节约内存
        1.内存对齐
            假设第一个成员从零地址开始,之后存储每个成员的地址编号必须能被该成员类型字节数整除,如果不能整除则填充空白字节

        2.内存补齐:
            在Linux中,计算结构体的对齐时,如果成员的类型字节数超过4,则按4字节计算;在Windows中,按实际字节数计算
                #pragma pack(n)  //设置上述超过的字节数,在Linux中只有1和2有效
            结构体的总字节数,必须能被字节数最大的成员数整除,如果不能则在末尾填充空白字节

二、联合
    联合的使用方法与结构体基本一致,区别是所有成员共用一块内存,其中一个成员的值发生改变,其它成员的值也会随之改变
    联合就是想用少量的内存对用较多的标识符,从而节约内存的目的,现在基本不再使用
    1、使用
        定义:
            union 联合名
            {
                类型名 成员名;
                ...
            };

    2、计算联合的总字节数
        不用考虑内存对齐,但依然要考虑内存补齐

    *如何判断系统的大小端:
        假设有十六进制数据0x01020304存储在0x0A起始的4字节内存中
            小端系统:高位数据存在高位地址(0A:04 0B:03 0C:02 0D:01)  //倒
            大端系统:高位数据存在低位地址(0A:01 0B:02 0C:03 0D:04)
        注意:
            个人PC一般都是小端,但是NUIX服务器和网络设备都是大端
            因此本地数据(本地字节序)传输到网络设备(网络字节序)时需要进行转换,该转换称为序列化和反序列化

三、枚举
    枚举类型是希望把一种类型可能出现的所有的值罗列出来,并取一个有意义的名字表示,除此之外,该类型的值如果是其它值则非法
    可以把枚举当做值受限的int类型
    1、使用
        定义:
            enum 枚举名
            {
                成员名=val,
                成员名=val,
                ...
                成员名=val
            };

    2、枚举常量和宏常量的区别
        a.枚举常量需要占用内存,而宏定义常量不占内存
        b.枚举常量的设计目的是为了限制实际数据输入,而宏常量是为了完成代码的替换
        c.枚举常量具有类型,宏常量没有类型
       
    注意:gcc不检查是否非法,g++检查非法
    注意:如果枚举成员不赋值,默认从0开始,后续成员依次+1;如果某个成员赋值,后续成员在它基础上依次+1


posted @ 2023-03-20 16:54  Phonyeee  阅读(8)  评论(0编辑  收藏  举报