文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言中枚举与联合体的使用方法(enum union)

2024-04-02 19:55

关注

enum的定义

枚举顾名思义就是一一列举,把可能的取值一一列举。

枚举的使用方式


//定义一个枚举Color的类型

enum Color // enum Color 是一个类型
{
	RED,  //逗号结尾
	GREEN,
	BLUE // 最后一个成员没有逗号没有分号
};
int main()
{
	printf("%d",RED);//0
	printf("%d",GREEN);//1
	printf("%d",BLUE);//2
	return 0;
}

{}中的内容是枚举类型的可能取值,也叫 枚举常量 。 这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。从赋值的地方开始,后面的枚举常量没赋值的话,也是从最后一次枚举常量赋值的地方赋值地方开始依次递增1数值


enum Color//颜色
{
	RED=1,
	GREEN=2,
	BLUE=4
};
int main()
{
	printf("%d",RED);//1
	printf("%d",GREEN);//2
	printf("%d",BLUE);//4
	return 0;
}

或者这样


enum Color//颜色
{
	RED=10,
	GREEN,
	BLUE
};
int main()
{
	printf("%d",RED);//10
	printf("%d",GREEN);//11
	printf("%d",BLUE);//12
	return 0;
}

当然枚举是类型还可以定义变量:

这个变量可以赋值枚举常量的可能取值


enum Color//颜色
{
	RED=10,
	GREEN,
	BLUE
};
int main()
{
	enum Color c = RED; //定义枚举变量,给它赋值枚举常量的可能取值RED
	printf("%d",c); //10
	c = GREEN;
	printf("%d",c); //11
		//	注意点,枚举常量是常量,所以不可以在使用过程中修改他的值
		//RED = 3; //是错误的
	return 0;
}

enum对比#define宏常量的好处

枚举的优点:

  1. 增加代码的可读性和可维护性;
  2. 和#define定义的标识符比较枚举有类型检查,更加严谨;
  3. 防止了命名污染(封装);
  4. 便于调试;
  5. 使用方便,一次可以定义多个常量。

union的定义

union 是共用体,它的意思就是union 里面成员变量的集合是公用内存空间的。

比如


//联合类型的声明
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
//计算连个变量的大小
printf("%d\n", sizeof(un)); //结果为4

成员变量 c占用一个字节,成员变量i占用4个字节,但是又一个字节和成员变量重叠了,这就是共用体

联合体大小的计算

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。


union Un1
{
	char c[5];
	int i;
};
union Un2
{
	short c[7];
	int i;
};
	//下面输出的结果是什么?
	printf("%d\n", sizeof(union Un1)); //结果为8
	printf("%d\n", sizeof(union Un2));//结果为16

分析:

联合体配合算大小端的问题

记得之前用类型转化的方式计算得到计算机是大小端,现在我们可以用联合体也得到计算机的大小端;

类型转化得到大小端的方式


int check()
{
	int a = 1; // 0x 00 00 00 01
	//低地址 ----------------------->高地址
	//小端:01 00 00 00
	//大端:00 00 00 01
	return *(char*)&a;
}
int main()
{
	int ret = check();
	
	if(ret == 1)
		printf("小端模式");
	else
		printf("大端模式");
	
	return 0;
}

联合体的方式


union Un
{
	char c;
	int i;	
};
int cheak()
{
	u.i = 1;
	//低地址 ----------------------->高地址
	//小端:01 00 00 00
	//大端:00 00 00 01
	
	//如果是小端,返回1,不是返回0
	
	return u.c;	
}
int main()
{
	int ret = check();
	
	if(ret == 1)
		printf("小端模式");
	else
		printf("大端模式");
	
	return 0;
}

总结

到此这篇关于C语言中枚举与联合体使用的文章就介绍到这了,更多相关C语言枚举与联合体用法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯