- 位段 ( 1.位段的内存分配 2.位段的跨平台问题 3.位段的应用)
- 枚举 ( 1.枚举类型的定义 2.枚举的优点 3.枚举的使用)
- 联合 ( 1.联合类型的定义 2.联合的特点 3.联合大小的计算)
位段
位段的声明和结构是类似的,有两个不同:1.位段的成员必须是int ,unsigned int 或 signed int。 2.位段的成员名后有一个冒号和一个数字。
位段式结构体:
struct A
{
int _a:2;
int _b:5;
int _c:10;
int _d:30;
};
#include<stdio.h>
struct S
{
//位段-二进制位
int a:2;
int b:5;
int c:10;
int d:30;
};//47bit-6字节-6*8=48bit
int main()
{
struct S s;
printf("%d\n",sizeof(s));//输出:8
return 0;
}
位段的内存分配:
1.位段的成员可以为int , unsigned int ,signed int 或是 char(属于整型家族)类型
2.位段的空间上是按照需要以4个字节(int)或1个字节(char)的方式来开辟的
3.位段涉及很多不确定的因素,位段是不跨平台的,注重可移植的程序应避免使用位段
位段的跨平台问题:
1.int位段被当成有符号数还是无符号数不确定
2.位段中最大位的数目不能确定
3.位段中的成员在内存中分配标准尚未定义
4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,不确定
总结:跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但有跨平台的问题存在。
枚举
枚举即一一列举
枚举类型的定义:
enum Day//星期
{
//枚举的可能取值
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
//枚举类型
enum Sex
{
//枚举的可能取值-常量
WALE=2,
FEMALE=4,
SECRET=8
};
{ }中的内容为枚举类型的可能取值,也叫枚举常量
这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可赋初值
枚举的优点:
1.增加代码的可读性和可维护性
2.和#define定义的标识符比较,枚举有类型检查,更严谨
3.防止命名污染
4.便于调试
5.使用方便,一次可定义多个常量
联合
联合-联合体-共用体
联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间。
联合的特点:
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小。
题:判断当前计算机的大小端存储
int check_sys()
{
union Un
{
char c;
int i;
}u;
u.i=1;
//返回1,表示小端
//返回0,表示大端
return u.c;
}
int main()
{
int a=1;
int ret=check_sys();
if(1==ret)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
}
联合大小的计算:
1.联合的大小至少为最大成员的大小
2.当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍
union Un
{
int a;
char arr[5];
};
int main()
{
union Un u;
printf("%d\n",sizeof(u));//输出:8
return 0;
}