c语言-联合体和枚举

news/2024/5/18 5:21:52 标签: c语言, java, 开发语言, 经验分享, 枚举, 联合体

文章目录


一、联合体

(1) 像结构体⼀样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。
(2)但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。
(3) 给联合体其中⼀个成员赋值,其他成员的值也跟着变化。

1. 联合体类型的声明和创建

关键字:union
声明:

#include <stdio.h>
//联合类型的声明
union Un// 类型名
{
	char c;//成员
	int i;
};
int main()
{
	union Un s = {0};//创建
	return 0;
}

2. 联合体的特点

联合的成员是共用同⼀块内存空间的,这样⼀个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。

//代码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;
 }

运行结果:

在这里插入图片描述
它们的地址都是一样的,说明它们共用一块空间
我们再来举一个例子

union Un
{
	char c;
	int i;
};
int main()
{
	//联合变量的定义
	union Un un = { 0 };
	un.i = 0x11223344;
	printf("%x\n", un.i);
	un.c = 0x55;
	printf("%x\n", un.i);
	return 0;
}

运行结果:
在这里插入图片描述
为什么结果不一样呢?
是因为它们共用一块空间,当 c 使用时就会改变 i 的值
内存布局:
在这里插入图片描述

3. 联合体大小的计算

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

如:

#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;
}

运行结果:
在这里插入图片描述
当遇到数组是我们只看类型如char c[5];->我们只看char的对齐数,char的对齐数为1
第一个输出结果
该类型的最大对齐数为4(int)
数组的大小为7,我们要保证它的大小,只能是最大对齐数的倍数,所以是8
第二个输出结果同理

4.总结

(1)使用联合体是可以节省空间的
(2)使用联合体的一个成员时就不要使用其他成员(因为其他成员的值会发生变化)

二、枚举

1. 枚举类型的声明

关键字:enum
枚举顾名思义就是⼀⼀列举。
把可能的取值⼀⼀列举。

比如我们现实生活中: ⼀周的星期⼀到星期日是有限的7天,可以⼀⼀列举
性别有:男、女、保密,也可以⼀⼀列举
月份有12个月,也可以⼀⼀列举
三原色,也是可以意义列举 这些数据的表示就可以使用枚举了。

如:

enum Day//星期
{
 Mon,
 Tues,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};
enum Sex//性别
{
 MALE,

 FEMALE,
 SECRET
}enum Color//颜⾊
{
 RED,
 GREEN,
 BLUE
};

以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。
{}中的内容是枚举类型的可能取值,也叫 枚举常量 。
这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。
如:

enum Color//颜⾊
{
 RED=2,
 GREEN=4,
 BLUE=8
};

2. 枚举类型的优点

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

  1. 增加代码的可读性和可维护性
  2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
  3. 便于调试,预处理阶段会删除 #define 定义的符号
  4. 使用方便,⼀次可以定义多个常量
  5. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用

3. 枚举类型的使用

enum Color//颜⾊
{
 RED=1,
 GREEN=2,
 BLUE=4
};
enum Color clr = GREEN;//使⽤枚举常量给枚举变量赋值

那是否可以拿整数给枚举变量赋值呢?在C语言中是可以的,但是在C++是不⾏的,C++的类型检查比较严格。

以上就是我的分享了,如果有什么错误,欢迎在评论区留言。
最后,谢谢大家的观看!


http://www.niftyadmin.cn/n/5234836.html

相关文章

controller能接收到数据有数据但是前端无法显示数据

又是制作系统时遇到的问题。只是想做个查询商品的页面&#xff0c;结果弄了一天&#xff0c;在网上各种查问题&#xff0c;各种解决办法用在我的代码上&#xff0c;换了无数种关键词搜索终于找到了一条成功解决了问题。 问题描述&#xff1a; 事情是这样的&#xff1a;我要写一…

二维码设备安全巡检手指口述应用

二维码设备安全巡检手指口述应用 在安全管理中&#xff0c;”手指口述”工作法是通过心想、眼看、手指、口述等一系列行为&#xff0c;对工作过程中的每一道工序进行确认&#xff0c;使“人”的注意力和“物”的可靠性达到高度统一&#xff0c;从而达到避免违章、消除隐患、杜绝…

柯桥西班牙语学校|实用西语吉祥话,场景都帮你想好了

1. ¡Feliz cumpleaos! Que este da est lleno de alegra, amor y bendiciones. (祝你生日快乐&#xff01;愿这一天充满欢乐、爱和祝福。) 2. ¡Hey [nombre del amigo/a]! Sabes qu da es hoy? ¡Es tu cumpleaos! Quera aprovechar para desearte un da lleno…

Spring Boot 集成 spring security 01

一、导入依赖&#xff08;pom.xml&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&qu…

什么是主机安全,有什么作用?

当今数字化时代&#xff0c;网络安全威胁和风险日益突出&#xff0c;已成为企业面临的重大安全挑战。网络攻击者不断尝试利用各种技术和手段对企业网络资源进行探测和攻击&#xff0c;如&#xff1a;利用漏洞、木马、钓鱼、勒索等方式窃取数据、破坏系统、篡改信息。因此&#…

1、Spring基础概念总结

Spring概述&#xff1a; Spring体系结构 IOC的概念和作用 耦合指的是对象之间的依赖关系&#xff0c;耦合越小越好 以jdbc为例 通过反射来注册驱动&#xff0c;那么会造成驱动名称写死在程序当中&#xff0c;这种结果显然是不太合理的通过配置文件的形式可以解决这种耦合问…

子集II(回溯+去重)

题目描述 给你一个整数数组 nums &#xff0c;其中可能包含重复元素&#xff0c;请你返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。返回的解集中&#xff0c;子集可以按 任意顺序 排列。 样例输入 示例 1&#xff1a; 输入&#xff1…

mac安装解压缩rar后缀文件踩坑

mac默认能够解压缩zip后缀的文件&#xff0c;如果是rar后缀的自己需要下载相关的工具解压 下载地址&#xff1a; https://www.rarlab.com/download.htm mac我是因特尔芯片所以下载 x64 然后解压缩文件进入目录 rar中 将可执行文件 rar、unrar 移动到 /usr/local/bin目录下即…