前言:
在C语言中,联合体(union)和枚举(enum)是两种特殊的数据类型,它们各有独特的用途和特性。
联合体(union):
联合体是一种特殊的数据类型,允许在相同的内存位置存储不同类型的变量。在联合体中,所有成员共享同一段内存空间,因此,同一时间只能有一个成员的值是有效的。这使得联合体非常适合用来处理需要共享同一内存空间的情况,例如在处理硬件接口时,可能需要将一组位解释为不同的数据类型。联合体的定义和使用如下:
```c
union Data {
int i;
float f;
char str[20];
} data;
```
在这个例子中,`data`的`i`,`f`和`str`成员都共享同一段内存空间。如果修改了其中一个成员的值,其它成员的值也会受到影响,因为它们共享同一段内存。
枚举(enum):
枚举是一种用户定义的整型数据类型,它由一组命名的整型常量组成。每个枚举值都有一个整数值,从0开始,默认情况下,每个后续值增加1。枚举可以用来表示一组相关的常量,使得代码更具有可读性和可维护性。枚举的定义和使用如下:
```c
enum Color {Red, Green, Blue} color;
```
在这个例子中,`Red`,`Green`和`Blue`都是枚举值,它们分别对应整数值0,1和2。我们可以通过`color`变量来存储和操作这些枚举值。
联合体和枚举在C语言中都有其独特的作用,合理使用它们可以使程序更加高效和清晰。
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;
}
1.2 联合体的特点(vs2022)
//代码1
#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;
}
//代码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;
}
1.3 相同成员的结构体和联合体对⽐
1.4 联合体⼤⼩的计算
#include <stdio.h>
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
int main()
{
//下⾯输出的结果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
return 0;
}
1.5联合体应用1:待殊商品信息
struct gift_list
{
//公共属性
int stock_number;//库存量
double price; //定价
int item_type;//商品类型
//特殊属性
char title[20];//书名
char author[20];//
作者
int num_pages;//⻚数
char design[30];//设计
int colors;//颜⾊
int sizes;//尺⼨
};
所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存。
struct gift_list
{
int stock_number;//库存量
double price; //定价
int item_type;//商品类型
union{
struct
{
char title[20];//书名
char author[20];//作者
int num_pages;//⻚数
}book;
struct
{
char design[30];//设计
}mug;
struct
{
char design[30];//设计
int colors;//颜⾊
int sizes;//尺⼨
}shirt;
}item;
};
1.6联合体应用2:判断当前机器⼤⼩端?
int check_sys()
{
union
{
int i;
char c;
}un;
un.i = 1;
return un.c;//返回1是⼩端,返回0是⼤端
}
2. 枚举类型
2.1 枚举类型的声明
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜⾊
{
RED,
GREEN,
BLUE
};
2.2 枚举类型的优点
2.3 枚举类型的使⽤
enum Color//颜⾊
{
RED=1,
GREEN=2,
BLUE=4
};
enum Color clr = GREEN;//使⽤枚举常量给枚举变量赋值