目录
1.位段
1.什么是位段?
- 位段的声明和结构是类似的,但有两个不同
- 位段的成员必须是
int
、unsigned int
、signed int
- 位段的成员名后边有一个冒号和一个数字(指占几个bit位)
struct A { int _a:3; int _b:4; int _c:5; int _d:4; };
- 位段的成员必须是
2.位段的内存分配
- 位段的成员可以是
int
、unsigned int
、signed int
、char
(属于整形家族) - 位段的空间是按照需要,以4个字节(
int
)或者1个字节(char)的方式来开辟的 - 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段
- 当十进制转化为二进制时,超出的部分会被截断
3.位段的跨平台问题
int
位段被当成有符号数还是无符号数是不确定的- 位段中最大位的数目不能确定
- 16位机器最大16,32位机器最大32,写成27,在16位机器会出问题
- 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义
- 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的
- 总结:跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在
4.位段的应用
- 例如:UDP、TCP报头等
2.枚举
1.什么是枚举?
- 枚举顾名思义就是一一列举
- 把可能的取值一一列举
2.枚举类型的定义
enum Color
{
RED,
GREEN,
BLUE
};
- 以上定义的
enum Color
是枚举类型 {}
中的内容是枚举类型的可能取值,也叫枚举常量- 这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值
enum Color { RED=1, GREEN=2, BLUE=4 };
3.枚举的优点
- 可以使用
#define
定义常量,为什么非要使用枚举?- 增加代码的可读性和可维护性
- 和
#define
定义的标识符相比,枚举有类型检查,更加严谨 - 防止了命名污染(封装)
- 便于调试
- 使用方便,一次可以定义多个常量
- 总结:能用枚举就用枚举,不用
define
没办法再用define
- 可读性和可维护性举例
void Menu() { printf("*********************************\n"); printf("**** 1. Add 2. Sub ****\n"); printf("**** 3. Mul 4. Div ****\n"); printf("**** 0. Exit ****\n"); printf("*********************************\n"); } enum Option { EXIT, // 0 ADD, // 1 SUB, // 2 MUL, // 3 DIV // 4 }; void main() { int input = 0; do { Menu(); Printf("请选择:>"); scanf("%d", &input); switch(input) { case ADD: // ... case SUB: // ... case MUL: // ... case DIV: // ... case EXIT: // ... default: // ... } }while(input); }
4.枚举的使用
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
enum Color clr = GREEN; // 只能拿枚举常量给枚举变量赋值,才不会出现类型的差异
clr = 5; // error,clr为num常量,赋初值后不可改变
3.联合体(共用体)
1.联合类型的定义
- 联合也是一种特殊的自定义类型
- 这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间
- 所以联合也叫共用体
- 联合体内,所有成员的起始地址都是一样的
- 联合体也可以使用. ->访问
- 例如:所占空间为4byte
// 联合类型的声明
union Un
{
char c;
int i;
};
// 联合变量的定义
union Un un;
```
## 2.联合的特点 && 计算
- 联合的成员是共用同一块内存空间的
- **联合体的大小至少是最大成员的大小**
- 因为联合体至少得有能力保存最大的那个成员
- 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
标签:定义,自定义,int,成员,enum,位段,枚举
From: https://blog.csdn.net/qq_37281656/article/details/139249123