1.联合体
联合体和结构体一样也有自己的成员,成员可以是不同类型,但是编译器只为最大的成员分配空间。
联合体的特点就是所有成员共用一块空间,也就是说给其中一个成员赋值,其他成员的值也随之改变,所以也叫:共用体。
1.1联合体的类型和声明
#include <stdio.h>
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un = {0};
//计算两个变量的⼤⼩
printf("%d\n", sizeof(un));
return 0;
}
结果是:4
也就是最大成员int的大小。
1.2联合体的特点
联合体的大小是最大成员的大小,因为联合体至少得有能力保存最大成员。
联合体中的所有成员的地址相同:
#include <stdio.h>
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un = {0};
// 下⾯输出的结果是⼀样的吗?
printf("%p\n", &(un.i));
printf("%p\n", &(un.c));
printf("%p\n", &un);
return 0;
}
输出结果:
001AF85C
001AF85C
001AF85C
联合体中的一个成员改变,其他成员也随之改变:
//代码2
#include <stdio.h>
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un = {0};
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);
return 0;
}
输出结果:
11223355
原因:这是因为每个成员共同使用一块空间,当我们给整型赋值为了0x11223344时,char类型的c的值就是0x44,此时改变c为0x55,也就是改变了i的最后一个字节变成0x11223355
1.3联合体的大小计算
联合体的大小最少是最大成员的大小;
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
1.4联合体判断大小端
int check_sys()
{
union
{
int i;
char c;
}un;
un.i = 1;
return un.c;//返回1是⼩端,返回0是⼤端
}
2.枚举
枚举,顾名思义,也就是一一例举,如:
⼀周的星期⼀到星期日是有限的7天
性别有:男、女、保密
这些数据的表示就可以使用枚举了
2.1枚举的类型和声明
enum Day//星期
{
Mon,//值为0
Tues,//值为1
Wed,//...
Thur,
Fri,
Sat,
Sun
};
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜⾊
{
RED,
GREEN,
BLUE
};
其中的enum Day , enum Sex , enum Color 都是枚举类型。
{}里面的成员就叫枚举常量。
它们都是有值的,默认是从0开始,下面以此类推,1,2,3,4...
当然在声明枚举类型的时候也可以赋初值。
enum Color//颜⾊
{
RED=2,
GREEN=4,
BLUE=8
};
2.2枚举的优点
可以使用
#define
定义常量,为什么非要使用枚举?
1.
增加代码的可读性和可维护性
2.
和#define定义的标识符比较枚举有类型检查,更加严谨。
3.
便于调试,预处理阶段会删除
#define
定义的符号
4.
使用方便
⼀次可以定义多个常量
5.
枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用