荆门哪里做网站,青岛网站建设哪家好,试描述一下网站建设的基本流程,wordpress远程图片本地化一、联合体
1.1 联合体类型的声明
像结构体⼀样#xff0c;联合体也是由⼀个或者多个成员构成#xff0c;这些成员可以是不同的类型。
声明方式如下图#xff1a; 那联合体和结构体究竟有什么区别呢#xff1f;#xff1f;
下面将重点讲解联合体的特点#xff01;联合体也是由⼀个或者多个成员构成这些成员可以是不同的类型。
声明方式如下图 那联合体和结构体究竟有什么区别呢
下面将重点讲解联合体的特点
1.2 联合体的特点
1.2.1 特点1
所有成员共⽤同⼀块内存空间。所以联合体也叫共⽤体。 我们可以发现三个地址打印出来是一样的。那既然都共用一块空间那大小有多大呢
1.2.2 特点2
编译器只为最大的成员分配⾜够的内存空间因为联合体至少得有能力保护最大的那个成员 1.2.3 特点3
给联合体其中⼀个成员赋值其他成员的值也跟着变化。 这里为什么打印出来的是11223355呢我们根据3个特点可以分析画出un的内部布局图 充分说明了特点3
1.3 联合体的大小
特点2提到编译器只为联合体最大的成员分配足够的空间那联合体的大小就一定等于最大成员变量的大小吗
答案是不对的我们可以看看下面的代码 我们可以验证出虽然编译器只为最大的成员分配足够空间但不代表联合体的大小就是最大成员变量的大小
联合体的大小要遵循以下两个特点
1、联合的大小⾄少是最⼤成员的大小。
2、当最⼤成员大小不是最大对齐数的整数倍的时候就要对⻬到最⼤对⻬数的整数倍。
这说明联合体虽然可以节省空间但也不是一味地节省他也是有自己的对齐规则的。
分析上图代码
Un1的第一个成员数组虽然是5个字节的大小但是最大对齐数只能取char类型所以是1而int是4所以Un1的最大对齐数是4为了保证能放下5个字节的空间所以最大对齐数翻倍变成8
Un2的第一个成员数组虽然是14个字节的大小但最大对齐数只能取short类型所以是2而int是4所以Un2的最大对齐数是4为了保证能放下14个字节的空间所以最大对齐数翻4倍变成16
1.4 相同成员的结构体和联合体的对比
我们再对⽐⼀下相同成员的结构体和联合体的内存布局情况。 这说明使用联合体是可以节省空间的
1.5 使用联合体节省空间的例子
⽐如我们要搞⼀个活动要上线⼀个礼品兑换单礼品兑换单中有三种商品图书、杯⼦、衬衫。 每⼀种商品都有库存量、价格、商品类型和商品类型相关的其他信息。
其他信息
图书书名、作者、⻚数
杯⼦设计
衬衫设计、可选颜⾊、可选尺⼨
如果直接用结构体的话 但我们会发现如果创建book变量那设计、颜色、尺寸属性就会浪费掉。如果创建cup变量那书名、作者、页数、可选颜色、尺寸属性就会浪费掉。如果创建shirt变量那书名、作者、页数属性就会浪费掉。这样就会导致内存出现浪费因为对于礼单兑换单的商品来说只有部分属性是通用的所以我们就可以将公共属性单独写出来剩余属于各种商品自身属性使用联合体联合起来没这样就可以减少所需的内存空间再一定程度上节省内存使得程序更加高效运行。 因为我们每个变量只使用一次所以可以直接使用匿名结构体。
1.6 运用联合体判断大小端 1.7 利用联合体打印存储的字节内容
既然可以判断大小端那其实也可以直接把存储的情况打印出来这是一个很神奇的代码 二、枚举类型
2.1 枚举类型的声明
枚举顾名思义就是⼀⼀列举。
把可能的取值⼀⼀列举。
⽐如我们现实⽣活中
⼀周的星期⼀到星期⽇是有限的7天可以⼀⼀列举
性别有男、女、保密也可以⼀⼀列举
⽉份有12个⽉也可以⼀⼀列举
三原⾊也是可以意义列举 { }中是枚举类型的可能取值也叫做枚举常量。
这些可能取值本身都是由值的默认是从0开始依次递增1当然我们在声明的时候也可以自己赋初值但是定义完成之后就不能在该类型的外部去修改了 2.2 枚举类型的优点
1、增加代码的可读性和可维护性
比如我们在实现游戏时常常会这样去写 此时如果不和菜单建立联系 我们并不能一下子就看出来case1和case0的含义可读性较差可如果在这边使用枚举类型就可以增加代码的可读性并且后期在维护的时候也方便。 2、 和#define定义的标识符⽐较枚举有类型检查更加严谨。
#define定义的标识符是不过是一个符号而枚举是一种类型有类型检查写代码会更加严谨
3、 便于调试预处理阶段会删除 #define 定义的符号 枚举类型在调试的时候会显示出成员名但是#define就不会标识符会直接替换成数字后期如果需要调试找错误就不利于发现问题 4.、使⽤⽅便⼀次可以定义多个常量
5.、枚举常量是遵循作⽤域规则的枚举声明在函数内只能在函数内使⽤
枚举有作用域的概念在一个函数内部使用出了函数就不能用了但是#define定义的标识符没有作用域概念他是一个全局都可以使用的常量。
2.3 枚举类型的使用 使用方法使⽤枚举常量给枚举变量赋值
那是否可以拿整数给枚举变量赋值呢
在C语⾔中是可以的但是在C是不⾏的C的类型检查⽐ 较严格。