C语言进阶要点笔记4

  • 五、结构体

1、定义和概念

struct 结构体类型名

{

         成员列表

};

可以先说明再定义,也可以在分号之前接着就定义

在分号之前定义结构体变量,同时省略结构体类型名,则之后不能再定义此种结构体变量,此时定义了就是唯一的,常用于使用次数有限的全局变量

typedef struct (结构体类型名可有可无)

{

       成员列表

}类型名称;    分号前不能再定义变量

若要定义变量则只需  类型名称加变量名  

变量名加点加成员名进行赋值

结构体说明时其成员列表可以使另一结构体,使用的时候可多级引用

相同类型的结构体变量可以直接相互赋值

2、结构体数组

结构体数组是数组,由若干个相同类型的结构体变量组成的集合

struct 结构体类型名 数组名[元素个数];

3、结构体指针

结构体指针定义和赋值的方法和普通变量一样

结构体整体引用也和普通变量一样

但引用结构体成员时不同,需要加括号,.的优先级比*高,(*ps).num

加括号麻烦,可用指向运算符(->)代替,ps->num

当有嵌套,引用里面结构体的成员时,第一层用指向运算符第二层用点运算符

4、结构体内存分配

#pragma pack (value)时的指定对齐值value。

value只能是: 1 2 4 8等

字节对齐,当前成员为value整数倍保持不变;当前成员小于value,但是加上后一成员刚好是value的整数倍也不变;当前成员小于value,加上后一成员也小于value的整数倍则补成value的整数倍。

可用sizeof测量所占空间

5、位段(位域)

struct packed_data
{
    unsigned int a:2;
    unsigned int b:6;
    unsigned int c:3;
    unsigned int  :1; // 无意义的位段
    unsigned int d:4;
    unsigned int i;
} data;

冒号后面数字表示占几位,不能对位段成员取地址

赋值时不要超出位段定义的范围,赋值超出范围会进行截取操作

可以定义无意义的位段,单纯的占空间,以保证后面的成员占据所需要的位

同一个结构体中,成员变量可以同时包括位段和普通成员变量


  • 六、共用体

共用体和结构体类似,也是一种构造类型的数据结构

共用体的定义方法也和结构体的定义方法非常相似,将struct改成union即可,其他的使用方法一样,但是不允许有位段

在进行某些算法的时候,需要将几种不同类型的变量存到同一段内存单元中,几个变量所使用的的空间相互重叠

共用体的大小是其占内存长度最大的成员的大小

共用体的成员在同一时间只有一个有效,常用于网络协议发送过程中


  • 七、枚举类型

将变量的值一一列举出来,变量的值只限于列举出来的值的范围内

enum 枚举类型名

{

         枚举值列表, (成员之间用逗号隔开)

};

也可用typedef

用枚举的地方都能用宏定义代替,反之不行

枚举成员可以为任意内容,其实际值为整数,默认从0开始递增,也可以通过给成员赋值改变成员对应的整数值

枚举变量的定义:enum 枚举类型名 枚举变量名

发布了4 篇原创文章 · 获赞 1 · 访问量 72

猜你喜欢

转载自blog.csdn.net/LF_1845529754/article/details/104025323