首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C语言】联合和枚举

【C语言】联合和枚举

作者头像
s-little-monster
发布2024-06-06 20:48:46
发布2024-06-06 20:48:46
2790
举报

一、联合体

1、联合体类型的声明

联合体的定义与结构体相似,但是联合体往往会节省更多的空间,它的特点是所有成员共用一块内存空间,结构体也叫共用体 联合体中给某一成员赋值,其他成员值往往会跟着变化

代码语言:javascript
复制
#include <stdio.h>
union Un
{
	char c;
	int i;
};
int main()
{
	union Un un = { 0 };
	printf("%d\n", sizeof(un));
	return 0;
}

定义联合体我们用的是union,定义格式与结构体相差不多,大括号里边是成员变量 输出结果:

按照结构体的标准来说,这里应该是8,但为什么会是4呢? 就是因为前边提到的:联合体的成员共用一块内存空间

2、联合体成员的特点

联合变量的大小至少是最大成员变量的大小

代码语言:javascript
复制
#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);
	printf("%p\n", &(un.i));
	printf("%p\n", &(un.c));
	printf("%p\n", &un);
	return 0;
}

我们发现第一行输出11223344被修改成了11223355 第二行联合体地址,联合体成员地址都是一个地址 所以我们验证了联合体成员变量共用一块内存

3、与结构体对比

代码语言:javascript
复制
struct Un
{
	char c;
	int i;
};
代码语言:javascript
复制
union Un
{
	char c;
	int i;
};

结构体内存中,灰色的是浪费掉的内存

4、计算联合体大小

联合体的大小至少是最大成员的大小 当最大成员大小不是最大对齐数的整数倍时,要对齐到最大对齐数的整数倍

代码语言:javascript
复制
#include <stdio.h>
union Un1
{
	char c[5];//1
	int i;//4
};
//当成员中有数组时,用其数组中每个数据的数据类型来比较最大对齐数
//4为最大对齐数,最大数为5,对齐到4的整数倍,即为8
union Un2
{
	short c[7];//2
	int i;//4
};
//4为最大对齐数,最大数为14,对齐到4的整数倍,即为16
int main()
{
	printf("%d\n", sizeof(union Un1));
	printf("%d\n", sizeof(union Un2));
	return 0;
}

我们在采购物品时(图书,杯子,笔记本,衣服),可以写一个结构来录入它们的信息

代码语言:javascript
复制
struct 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;//尺⼨
};

我们用结构可以很快的写出来,但是这样会占用一些不必要的内存,例如图书没必要录入它的颜色,设计等属性,杯子也没有书名和作者,这样,我们的联合就可以发挥它的作用,在一定程度上节省内存

代码语言:javascript
复制
struct gift_list
{
	int stock_number;//库存量
	double price; //定价
	int item_type;//商品类型

	union {
		struct
		{
			char title[20];//书名
			char author[20];//作者
			int num_pages;//⻚数
		}book;
		struct
		{
			int colors;//颜色
			int sizes;//尺寸
			char design[30];//设计
		}cup;
		struct
		{
			char design[30];//设计
			int colors;//颜⾊
			int sizes;//尺⼨
		}clothes;
		struct
		{
			int num_pages;//页数
			int sizes;//尺寸
		}notebook;
	}item;
};

二、枚举

1、枚举的声明

枚举就是一一列举的意思,枚举用enum来定义,定义方法也是类似结构体与联合体的方式

代码语言:javascript
复制
enum Day//星期
{
 Mon,
 Tues,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};

enum Day就是枚举类型,大括号中的内容为枚举类型的可能取值,也叫枚举常量,这些枚举常量都是有值的,默认从0开始,依次递增1,也可以赋初始值

代码语言:javascript
复制
enum Day
{
 Mon,
 Tues,
 Wed,
 Thur=2,
 Fri,
 Sat,
 Sun
};

从上到下值依次为0 1 2 2 3 4 5 中间赋值,前面从头开始为0,依次递增1,到该枚举常量时,取被赋予的值,然后往下还是依次递增1

代码语言:javascript
复制
enum Day
{
 Mon=4,
 Tues,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};

从上到下值依次为4 5 6 7 8 9 10 依次递增1

2、枚举的优点

我们知道#define也可以完成枚举这样的效果,那为什么我们还要使用枚举呢? ①增强代码的可读与可维护性 ②和#define相比枚举有类型检查,更加安全严谨 ③便于调试,在预处理阶段,会删除#define定义的符号,直接用所替换的值替换,导致预处理与真实代码不统一,无法更好地调试 ④使用方便,一次可以定义多个常量 ⑤枚举遵循作用域规则,枚举声明在函数内,只能在函数内使用

3、枚举类型的使用

代码语言:javascript
复制
enum Day
{
 Mon,
 Tues,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};
enum Day today = Mon;

使用枚举常量为枚举变量赋值,在C语言中可以用整数来给枚举变量赋值,但在C++中不可以

今日分享就到这里了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、联合体
    • 1、联合体类型的声明
    • 2、联合体成员的特点
    • 3、与结构体对比
    • 4、计算联合体大小
  • 二、枚举
    • 1、枚举的声明
    • 2、枚举的优点
    • 3、枚举类型的使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档