1.1位段
位段的声明和结构是类似的,有两个不同:
1.位段的成员必须是 int、unsigned int 或signed int 。
2.位段的成员名后边有一个冒号和一个数字。
_a表示占用2个比特位,_b占用5个比特位, _c占用10个比特位, _d占用30个比特位;
先开辟一个整型,4个字节,32个比特位,_c用去2个剩余30个,_b用去5个剩余25,_c用10剩15,但是_d需要30个比特位,剩余的15个不够,因此再增加一个整型,所以最后打印出来的8个字节;
例2:
1.2 位段的跨平台问题
1. int 位段被当成有符号数还是无符号数是不确定的。
2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机
器会出问题。
3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
舍弃剩余的位还是利用,这是不确定的
总结:
跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。
2.1 枚举类型的定义
以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。
{}中的内容是枚举类型的可能取值,也叫 枚举常量 。
这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。
例如:
初始值:
赋值:

2.2 枚举的优点
为什么使用枚举?
我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
3. 防止了命名污染(封装)
4. 便于调试
5. 使用方便,一次可以定义多个常量
3.1联合类型的定义(公用体)
联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
比如:
3.2联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联
合至少得有能力保存最大的那个成员)
判断大小端
3.3 联合体大小的计算
动态内存
1.为什么要掌握动态内存
2.动弹内存的介绍
2.1 malloc和free
size_t size是要开辟空间的大小,单位字节;
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
如果开辟成功,则返回一个指向开辟好空间的指针。
如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
返回值的类型是 void* ,返回的是开辟空间的起始地址,malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己
来决定。
如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器
C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下:
void free (void* ptr);


free后p变成了野指针,所有需要将它变成NULL;
2.2 colloc
colloc开辟空间成功返回空间起始地址,失败则返回NULL,与molloc一样;
与molloc相比,colloc函数会初始化空间,molloc不需要初始化,molloc的效率更高;
直接打印开辟出来的空间
2.3 realloc
realloc可以开辟空间,也可以调整空间
realloc开辟空间有两种情况:
情况1:原空间之后有足够空间
情况2:原空间之后没有足够空间
情况1:
当是情况1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。
情况2:
当是情况2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小
的连续空间来使用。这样函数返回的是一个新的内存地址
情况2的realloc使用示例