一、结构体
结构体相关知识请参考:结构体
二、位段
(一)位段的定义
- 位段很像结构体,但是它成员只支持
int unsigned int signed int
类型,C99标准以后也支持char
类型; - 位段的成员名后面有一个冒号和数字(所占二进制位的个数)
struct A
{
int _a:2;
int _b:5;
int _c:10;
};
typedef struct S
{
char a : 3;
char b : 4;
char c : 5;
char d : 4;
}S;
int main()
{
S s = { 0 };
s.a = 10;
s.b = 12;
s.c = 3;
s.d = 4;
return 0;
}
- a和b两个占一个字节,10的二进制是1010,取三位是010,放到一个字节的末尾,12的二进制是1100,放到这个字节里,所以这一个字节是01100010,写成16进制就是0X62。
- c占一个字节,放得下3;
- d占一个字节,放得下4
(二)位段的应用
使用位段主要是为了节省空间,不像结构体,要很多对齐,适用于要节省空间的应用中。
三、枚举
(一)枚举的定义
- 枚举是种类型,注意枚举里的枚举常量都要大写,并且使用,
enum Colour
{
GREEN = 1,
BLACK,
RED,
};
- 枚举常量可以赋予初值,没有初值默认从0 开始,一次递增1;有初值,从初值开始依次递增1。
(二)枚举的优点
- 增加代码的可读性和可维护性;
- 比
#define
有类型检查; - 防止命名污染,有封装;
- 便于调试
- 使用方便,一次定义多个常量。
四、联合体
联合体和结构体一样,不过这些成员共用一块空间
(一)联合体大小判断
- 联合体大小至少是最大成员的大小;
- 当最大成员大小不是最大对齐数的整数倍时,要对齐到最大对齐数的整数倍。
(二)联合体内存
可以看出,共用同一块内存的成员,地址相同,遵循小段规则,对数据进行修改。