本篇博客探讨C中除了结构体以外的两种自定义类型:联合和枚举
一、联合体(也称共用体)
1.联合体类型的声明
#include <stdio.h>
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un = {0};
//计算联合体变量的⼤⼩
printf("%d\n", sizeof(un)); //4
return 0;
}
2.联合体的特点:联合的成员共用同一块内存空间,一个联合变量的大小至少是最大成员的大小
例:使用联合体判断当前机器是大端还是小端
int check_sys()
{
union
{
int i;
char c;
}un;
un.i = 1;
return un.c;//返回1是⼩端,返回0是⼤端
}
这个联合体的大小是4个字节(因为至少要装下一个int,将i的值赋为1,再用c去访问第一个字节,拿到1就是小段存放,拿到0就是大端存放,很好地体现了联合的成员共用同一块内存空间的特点)
3.相同成员的结构体和联合体对比
struct S
{
char c;
int i;
}
union un
{
char c;
int i;
}
4.联合体大小的计算
(1)联合的大小至少是最大成员的大小
(2)当最大成员大小!=最大对齐数的整数倍,就要对齐到最大对齐数的整数倍
#include <stdio.h>
union Un1
{
char c[5]; //对齐数==1
int i; //对齐数==4
};
union Un2
{
short c[7]; //对齐数==2
int i; //对齐数==4
};
int main()
{
//下⾯输出的结果是什么?
printf("%d\n", sizeof(union Un1)); //输出8
printf("%d\n", sizeof(union Un2)); //输出16
return 0;
}
二、枚举
1.枚举类型的声明
enum Color//颜⾊
{
RED, //内存中值为0
GREEN, //内存中值为1
BLUE //内存中值为2
};
**
2.枚举的优点
**
(1)增加代码可读性(每个数值有其对应名字)和可维护性
(2)和#define定义的标识符比较,枚举有类型检查,更加严谨
(3)便于调试(预处理阶段会删除#define定义的符号)
(4)使用方便,一次可以定义多个常量
(5)枚举常量遵循作用域规则,枚举声明在函数内,只能在函数内使用
3.枚举类型的使用(计算器改良版)
enum Option
{
EXIT,//0
ADD,//1,表示加法
SUB,//2,表示减法
MUL,//3,表示乘法
DIV//4,表示除法
};
int main()
{
int input = 0;
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
//...
break;
case SUB:
//...
break;
case MUL :
//...
break;
case DIV:
//...
break;
case EXIT:
//...
break;
default:
//...
break;
}
return 0;
}