【C语言】自定义类型:联合体和枚举

1. 联合体

1.1 联合体的特点

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。

但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间所以联合体也叫:共⽤体。

cpp 复制代码
union Un
{
	char c;
	int i;
};
int main()
{
	union Un u = { 0 };
	printf("%zd\n", sizeof(u));
	printf("%p\n", &u);
	printf("%p\n", &u.c);
	printf("%p\n", &u.i);
	return 0;
}

因为共用着一块空间,所以当给联合体其中一个成员赋值,其他成员的值也跟着变化。

1.2 联合体大小的计算

• 联合的⼤⼩⾄少是最⼤成员的⼤⼩。

• 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。

cpp 复制代码
union Un
{
	char c[5];
	int i;
};

int main()
{
	union Un u = { 0 };
	printf("%zd\n", sizeof(u));
	return 0;
}

使⽤联合体是可以节省空间的,举例:

⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。

每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。

图书:书名、作者、⻚数

杯⼦:设计

衬衫:设计、可选颜⾊、可选尺⼨

那我们不耐⼼思考,直接写出⼀下结构

cpp 复制代码
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;//尺⼨
};

上述的结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息 是常⽤的。⽐如: 商品是图书,就不需要design、colors、sizes。 所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就以 介绍所需的内存空间,⼀定程度上节省了内存。

cpp 复制代码
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.3 联合体的一个练习

写⼀个程序,判断当前机器是⼤端?还是⼩端?

在大端模式下,数据的高字节位储存在内存的低地址中,而数据的低字节位储存在内存的高地址中。这种排列方式使得最高字节位位于地址的最前端。

与大端相反,小端模式下,数据的低位字节被存储在内存的低地址中,而高位字节则存储在高地址中。这意味着最低位字节位于地址的最前端。

cpp 复制代码
union Un
{
	char c;
	int i;
};
int check_sys()
{
	union Un u;
	u.i = 1;
	return u.c; //返回1是大段,返回0是小端
}

2. 枚举

2.1 枚举类型的声明

枚举顾名思义就是一一列举的意思。

把可能得取值一一列举。

一周的星期一到星期天是有限的7天,可以一一列举。

性别有:男、女、保密,也可以一一列举

这些数据的表示就可以使用枚举了。

cpp 复制代码
enum Day//星期
{
    Mon,
    Tues,
    Wed,
    Thur,
    Fri,
    Sat,
    Sun
};
enum Sex//性别
{
    MALE,
    FEMALE,
    SECRET
};

枚举常量的默认初始值是从0开始自动递增的整数。

当给某一个成员赋值后,则该成员后面的枚举常量为从该成员开始自动递增的整数。

2.2 枚举类型的优点

为什么使⽤枚举?

我们可以使⽤ #define 定义常量,为什么⾮要使⽤枚举?

枚举的优点:

  1. 增加代码的可读性和可维护性

  2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。

  3. 便于调试,预处理阶段会删除 #define 定义的符号

  4. 使⽤⽅便,⼀次可以定义多个常量

  5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤

相关推荐
stm 学习ing6 分钟前
HDLBits训练5
c语言·fpga开发·fpga·eda·hdlbits·pld·hdl语言
虾球xz1 小时前
游戏引擎学习第55天
学习·游戏引擎
就爱学编程1 小时前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
oneouto1 小时前
selenium学习笔记(二)
笔记·学习·selenium
sealaugh321 小时前
aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发
笔记·学习·aws
炭烤玛卡巴卡2 小时前
学习postman工具使用
学习·测试工具·postman
北国无红豆2 小时前
【CAN总线】STM32的CAN外设
c语言·stm32·嵌入式硬件
单片机学习之路2 小时前
【C语言】结构
c语言·开发语言·stm32·单片机·51单片机
thesky1234562 小时前
活着就好20241224
学习·算法
蜗牛hb2 小时前
VMware Workstation虚拟机网络模式
开发语言·学习·php