前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >轻松拿捏C语言——自定义类型之【联合体与枚举】

轻松拿捏C语言——自定义类型之【联合体与枚举】

作者头像
用户11162265
发布2024-06-14 14:53:37
820
发布2024-06-14 14:53:37
举报
文章被收录于专栏:C语言

🌟一、联合体(共用体)

🌙1、声明

联合体和结构体一样可以有多个成员,成员类型可以不同。

联合体所有成员共用一块空间,所以联合体又叫 共用体

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

在声明上,联合体和结构体类似,只是把struct关键字换成了union关键字。

给联合体一个成员赋值,其他成员的值也会跟着变化

代码语言:javascript
复制
#include <stdio.h>
//联合类型的声明
union Un
{
	char c;
	int i;
};
int main()
{
	//联合变量的定义
	union Un un = { 0 };
	//计算连个变量的⼤⼩
	printf("%d\n", sizeof(un));
	return 0;
}

这里结果为4,因为这里int最大,占四个字节

🌙2、特点

代码1

代码语言:javascript
复制
#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

代码语言: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);
	return 0;
}

运行结果

可以看到结果不是11223344,第四个字节内容44被换成了55

🌙3、大小计算

联合的大小至少是最大成员的大小。

当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

(这里最大对齐数和结构体中一样,

可以参考轻松拿捏C语言——自定义类型之【结构体】-CSDN博客

举例:

代码语言:javascript
复制
#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;
}

结果为8和16。

你对了吗?

在union Un1中成员有两个,char c[5]占5个字节大小,在vs中1<8,所以char的对齐数为1,int i占4个字节大小,在vs中4<8,所以int类型对齐数为4, 所以在union Un1中最大对齐数为4。

最大成员大小为5,5不是最大对齐系数4的倍数,所以对齐到8

在union Un2同理。

用联合体判断大小端字节序

代码语言:javascript
复制
int check_sys()
{
 union
 {
 int i;
 char c;
 }un;
 un.i = 1;
 return un.c;//返回1是⼩端,返回0是⼤端
}

🌟二、枚举类型

🌙1、声明

枚举就是一 一列举,

比如列举性别有男女,列举月份有1~12月,列举一周有7天

枚举类型关键字enum

星期:

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

性别:

代码语言:javascript
复制
enum Sex//性别
{
 MALE,
 FEMALE,
 SECRET
};

这里的enum Day , enum Sex都是自定义的枚举类型

{ }中的内容就是枚举类型的可能取值,也叫 枚举常量

这些枚举常量是有值的,默认从0开始递增,但也可以在声明的赋初值

代码语言:javascript
复制
enum Color//颜⾊
{
 RED=2,
 GREEN=4,
 BLUE=8
};

🌙2、优点

我们可以用#define 定义常量,为什么非要用枚举?

枚举的优点

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

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

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

4. 使用方便,一次可以定义多个常量

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

🌙3、使用

使用枚举常量给枚举变量赋值

代码语言:javascript
复制
enum Color//颜⾊
{
 RED=1,
 GREEN=2,
 BLUE=4
};
enum Color clr = GREEN;

在C语言中可以给枚举变量赋值,比如 enum Color clr = 5;但不推荐这样

但在C++中这样是不行的

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

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

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

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

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