自定义数据类型
位段
1什么是位段
位段的声明和结构是类似的,有两个不同
1位段的成员必须是int、unsigned int 或signed int 。
2位段的成员名后边有一个冒号和一个数字。
1 | 比如 |
1 |
|
2位段的内存分配
1位段成员可以是int unsigned int signed int 或者是char(属于整型家族)类型。
2位段的空间上是按照需要以4个字节或者1个字节(char)的方式开辟的。
3位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
在定义位段的变量中,最后一个不能大于32
1 |
|
3位段的跨平台问题
1int位段被当成有符号数还是无符号数是不确定的。
2位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题)
3位段中的成员在内存中从左向右 分配,还是从右向左分配标准尚未定义。
4当一个结构包含两个位段,第二个成员比较大,无法容纳第一个剩余的位段时,是舍弃剩余的位还是利用,这是不确定的。
总结:
和结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。
枚举
枚举故名思义就是一一列举
把可能的取值一一列举
1定义
1 | enum Day//星期 |
1 | enum Sex//星期 |
1 | enum Color |
1 |
|
2枚举的优点
为什么使用枚举?
我们可以使用#define来定义常量,使用枚举的优点是什么呢。
1增加代码的可读性和可维护性。
2和#define定义的标识符比较枚举有类型检查,更加严谨。
3防止命名污染(命名冲突)(封装)。
封装就是把数据和函数打包到一个类里面
4便于调试。
5使用方便,一次可以定义多个常量。
程序的执行过程
c语言的源代码–预编译-链接-可执行程序
这里的预编译就是在处理#define之类的东西
预编译会把所有的注释都删除
enum的大小怎么算呢
1 |
|
联合(共用体)
1联合类型的定义
联合是一种特殊的自定义类型,这种自定义类型的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
1 |
|
2特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合有能力 保存最大的那个成员)。
联合体内的成员不能同时使用
结构体、枚举、联合体的关键字不一样,性质也不一样
3联合大小的计算
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
相关推荐视频——https://www.bilibili.com/video/BV1oi4y1g7CF?p=63&spm_id_from=pageDriver