联合体
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
联合体又名共用体,顾名思义他的成员公用一块空间。这也是他的一大特点。
关键字:union
联合体的声明:
union+名字{
成员变量;
};
创建一个联合体和使用:
union U{
char i;
int a;
};
int main()
{
union U s;
s.a=0x11223344;//以十六进制存进去
s.i=0x55;
return 0;
}
它的声明和创建和结构体是一样的,他们也都属于自定义类型。
联合体的内存计算:
我们创建一个联合体,并打印他们成员里面的地址就可以知道他们的是公用一块空间的。
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un = { 0 };
un.i = 0x11223344;
un.c = 0x55;
printf("%p\n", &un.i);
printf("%p", &un.c);
//printf("%x\n", un.i);
return 0;
}
联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合 ⾄少得有能⼒保存最⼤的那个成员)。如上面这个联合,我们可以来求一下他的大小:
算出来是4个字节:
就证明了他的特点。
我们来画图,可以更加直观:
由图我们可以知道,当我们改变其中一个变量的值时就可能会改变其中成员的值;
求大小端(用联合体)
要我们写一个程序来判断大小端:
int check_sys()
{
union
{
int i;
char c;
}un;
un.i = 1;
return un.c;//返回1是⼩端,返回0是⼤端
}
这就是利用它里面的成员共用一块空间的特点;我们返回un.i是就返回整数的一个字节的内容;如果是小端存储的话,那么我们取出来一个字节的内容的话就是1;大端的话就是0;
枚举
枚举顾名思义就是就是一一列举,就是把可能的情况一一列举出来。
就比如:一周有多少天,基本的三种颜色:红黄蓝;
等等,就是这个情况你可以一一列举出来,如果你想要枚举来写题目的话就一定要将所有情况列举出来,不能少也不能重复,所以要求比较高。
声明:
关键字:enum
enum 名字{
枚举类型,
};
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
枚举类型的可能取值,也叫 枚举常量 。
这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值
从这里我们可以可以证明这个。
其实他和#define x 1;一样,我们直接将这个x替换成一。
这里我们的的s=Mon,也是将Mon替换成0;
当然我们也可以将枚举类型进行初始化:
enum Day//星期
{
Mon=2,
Tues=4,
Wed=5,
Thur=6,
Fri,
Sat,
Sun=3
};
如果这时我们将s=Fri,打印出来的值是7,因为你没有给他初始化,它就会在从我们初始化的的地方加,加到它自己这里来,这里的Sat就是8,但是Sun你对他初始化了就是3;
我们可以使⽤ #define 定义常量,为什么⾮要使⽤枚举?
枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
3. 便于调试,预处理阶段会删除 #define 定义的符号
4. 使⽤⽅便,⼀次可以定义多个常量
5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤
那是否可以拿整数给枚举变量赋值呢?在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐ 较严格。