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

news2024/11/23 18:57:06

目录

一、联合体(共用体)

(1)联合体类型的声明

(2)联合体类型的特点

(3)联合体和结构体的比较

(4)联合体大小的计算

(5)联合体的应用

二、枚举类型

(1)枚举的声明

(2)枚举的优点

(3)枚举类型的使用


一、联合体(共用体)

(1)联合体类型的声明

        形式上跟结构体相似,只不过把 struct 改为 union:

union U
{
	char c;//1 
	int i; //4
};

(2)联合体类型的特点

  •  只为需要空间最大的成员分配足够的空间。
  •  成员共用一个空间(因此,联合体又叫共用体)。

        以上代码,联合体大小是成员 i (所需空间最大的成员)的大小;联合体、每个成员的地址都是 004FFA90(成员共用一个空间)。如下所示:

        更改成员 c 的值,成员 i 的值也会改变:

(3)联合体和结构体的比较

// 结构体
struct S
{
 char c;
 int i;
};

// 联合体
union Un
{
 char c;
 int i;
};

        内存对比:

        看应用场景选择使用结构体还是联合体,应用见(5)。

(4)联合体大小的计算

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

        例子:

(5)联合体的应用

        联合体适用于不需要给每个成员开辟空间,且成员不需要同时使用的场景,可以节省空间。例1:存储商品的信息,如下(蓝色部分是三种商品共有的信息):

        如果直接用结构体类型存储,如下:

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;//尺寸
};

        定义商品变量时,图书不需要设计、颜色、尺寸信息;杯子不需要书名、作者、页数等信息。使用结构体类型,会浪费很多空间。

        我们可以把共有的信息单独写出来,三种特殊的信息用联合体存储(只为最大的特殊信息开辟空间),就能节省空间,如下:

struct gift_list
{
	int stock_number;//库存量
	double price; //定价
	int item_type;//商品类型

    // 只给 item.book 分配空间
	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;
};

例2:判断当前机器是大端还是小端。

方法1:

int check_sys()
{
    // 1的十六进制(int为4字节):0x00 00 00 01
    // 地址从左向右递增
    // 大端:00 00 00 01(低位数据放高地址)
    // 小端:01 00 00 00(地位数据放低地址)
	int a = 1;
	if (*(char*)&a == 1) // 取最低的一个字节数据
		return 1; // 01,小端
	else
		return 0; // 00,大端
}

方法2(用联合体):

二、枚举类型

(1)枚举的声明

        枚举就是 一 一 列举,其声明形式如下:

enum Day//星期
{
	Mon, // 枚举常量
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};

enum Sex//性别
{
	MALE,
	FEMALE,
	SECRET
};

        包含的内容是枚举类型可能的取值,称为枚举常量。枚举常量的取值,默认从0开始依次递增,也可以赋初值:

(2)枚举的优点

  •  增加了代码的可读性和可维护性。
// 如果用变量代表性别
int sex = 0; // 0 表示男,1表示女,2表示保密
// 判断是否是男性
if(sex == 0)
    printf("yse");
// 明显,0、1、2 的含义不直观


// 如果用枚举代表性别
enum Sex
{
	MALE, 
	FEMALE,
	SECRET
};
enum Sex sex = MALE;
// 判断是否是男性
if(sex == MALE)
    printf("yse");
// MALE就是男,可读性明显增强
  •  和 #define 定义的标识符比较,枚举有类型检查,更加严谨,不易出错。
#define MALE 0
#define FEMALE 4
// 宏定义只是在编译时,用 0 替换 MALE,MALE 没有类型

enum Sex
{
	MALE, 
	FEMALE,
	SECRET
};
// 而枚举中的 MALE 有类型,就是 enum Sex
  •  使用方便,一次可以定义多个常量。
#define MALE 0
#define FEMALE 1
#define SECRET 2
// 宏定义要多次写 #define,并且值也要自己设置

enum Sex
{
	MALE, 
	FEMALE,
	SECRET
};
// 而枚举只需要在一个枚举类型里,加一个枚举常量名,自动赋值。
  •  枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用(宏定义只能全局)。

(3)枚举类型的使用

        在 C 语言中可以拿整数给枚举变量赋值;但 C++ 的类型检查更严谨,不能拿整数给枚举变量赋值。

        C 中:

        C++ 中:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2151650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM8L101低功耗的理解

一.通过降低时钟频率来降低功耗: 规格书如图 1.code 从flash启动,主频率是16Mhz时,功耗测量2.51ma左右,对应程序如下: 2.code从flash启动,主频率是2Mhz时(上电默认值),功…

Android 如何使用jdk命令给应用/APK重新签名。

写在前面:本篇文章介绍Windows命令行中,如何使用jdk命令给已经签过名的apk重新签名。 使用工具:jarsigner。jarsigner是jdk自带的工具,签名之前确保Windows电脑中已安装jdk。我的环境如下:   后续操作步骤如下&…

力扣(leetcode)每日一题 2332 坐上公交的最晚时间

题目: 给你一个下标从 0 开始长度为 n 的整数数组 buses ,其中 buses[i] 表示第 i 辆公交车的出发时间。同时给你一个下标从 0 开始长度为 m 的整数数组 passengers ,其中 passengers[j] 表示第 j 位乘客的到达时间。所有公交车出发的时间互…

(七)使用SoapUI工具调用WebAPI

1.调用一个无参数的GET请求 [HttpGet(Name "GetWeatherForecast")]public IEnumerable<WeatherForecast> Get(){return Enumerable.Range(1, 5).Select(index > new WeatherForecast{Date DateTime.Now.AddDays(index),TemperatureC Random.Shared.Next(…

QFramework v1.0 使用指南 更新篇:20240918. 新增 BindableList

20240918. 新增 BindableList BindableProperty 很好用&#xff0c;但是不支持 List 等集合。 而 Bindable List 功能群友呼吁了很久了。 应群友要求&#xff0c;笔者实现了 Bindable List。 基本使用方式如下: using System; using UnityEngine; using UnityEngine.UI;na…

最新版本TensorFlow训练模型TinyML部署到ESP32入门实操

最新版本TensorFlow训练模型TinyML入门实操 1.概述 这篇文章介绍微型嵌入式设备的机器学习TinyML&#xff0c;它们的特点就是将训练好的模型部署到单片机上运行。 2.TensorFlow深度学习原理 TensorFlow开源项目是由google研发的一个嵌入式机器学习工具&#xff0c;通过调用…

智慧安防监控EasyCVR视频汇聚管理平台如何修改视频流分辨率?

智慧安防监控EasyCVR视频管理平台能在复杂的网络环境中&#xff0c;将前端监控设备进行统一集中接入与汇聚管理。EasyCVR平台支持H.264/H.265视频压缩技术&#xff0c;可在4G/5G/WIFI/宽带等网络环境下&#xff0c;传输720P/1080P/2K/4K高清视频。视频流经平台处理后&#xff0…

高质量的翻译:应用程序可用性和成功的关键

在日益全球化的应用市场中&#xff0c;开发一款优秀的产品只是成功的一半。另一半&#xff1f;确保你的用户&#xff0c;无论他们在哪里或说什么语言&#xff0c;都能无缝理解和使用它。这就是高质量翻译的用武之地——不是事后的想法&#xff0c;而是应用程序可用性和最终成功…

如何写一个自动化Linux脚本去进行等保测试--引言

#我的师兄喜欢给我的休闲实习生活加活&#xff0c;说是让我在实习期间写一个自动化脚本去进行等保测试。呵呵哒。 怎么办呢&#xff0c;师兄的指令得完成&#xff0c;师兄说让我使用Python完成任务。 设想如下&#xff1a; 1、将Linux指令嵌入到python脚本中 2、调试跑通 …

C++11——function与bind

包装器 function包装器function的介绍function的使用function的使用场景function的意义 bind包装器bind的介绍bind的使用 function包装器 function的介绍 function是用来包装函数的&#xff0c;所以叫做包装器或者适配器&#xff0c;fuction的本质其实是一个类模板。 functio…

Mac使用gradle编译springboot-2.7.x源码

1 开发环境&#xff1a; JDK8 ideaIU-2024.2.2 gradle-7.6.3 代理网络 2 下载springboot源码 代码仓库网址 git clone -b 2.7.x https://github.com/spring-projects/spring-boot.git3 安装gradle gradle下载网址 https://services.gradle.org/distributions/ 安装此文件指…

Three.js 3D人物漫游项目(上)

本文目录 前言1、项目构建1.1 安装依赖1.2 初始化1.3 项目结构1.4 初始化的项目运行 2、加载模型2.1 threejs三要素2.1.1 代码解读 2.2 加载模型2.2.1 代码解读 2.3 效果 前言 在数字技术的浪潮中&#xff0c;三维图形渲染技术以其独特的魅力&#xff0c;正逐步渗透到我们生活的…

基于无人机影像的可见光单木分割数据集-json格式

基于无人机影像的可见光单木分割数据集&#xff0c;共1700张影像&#xff0c;数据集大小3.6GB&#xff0c;分割标注采用标准json格式。 该数据集是一个专门用于基于无人机可见光影像进行单木分割的数据集&#xff0c;旨在帮助研究人员和开发者训练和评估基于深度学习的图像分割…

4.5 pandas 实战 分析抖音播放数据(1)

课程目标 基于pandas对抖音播放数据做数据分析 数据准备 点此去下载 课程内容 导包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns plt.rcParams["font.family"] "SimHei" plt.rcParams["ax…

道路坑洞分割数据集/道路裂纹分割数据集

1.道路坑洞,道路裂纹分割数据集&#xff0c;包含5790张坑洞分割图像数据&#xff08;默认分割标注png图片&#xff0c;850MB&#xff09;2.10000余张道路裂纹图像数据&#xff08;默认分割标注png图片&#xff0c;3.7GB&#xff09;3。道路坑洞&#xff0c;道路 道路坑洞与裂纹…

关于“华为杯”第二十一届中国研究生数学建模竞赛赛题下载及提交作品的重要提醒

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 各参赛队伍&#xff1a; “华为杯”第二十一届中国研究生数学建模竞赛即将于2024年…

零基础玩转实在Agent -- 基础篇|实在Agent研究

前言 实在Agent是什么 实在Agent&#xff08;智能体&#xff09;是实在智能基于RPA和自研屏幕语义理解技术&#xff0c;结合最前沿的Al大模型打造的自动化智能体产品。 它能像朋友一样聊天&#xff0c;并通过对话的方式理解你的任务需求&#xff0c;自动规划任务的实现方式&…

Qt clicked()、clicked(bool)、toggled(bool)信号的区别和联系

clicked() 信号 所属控件&#xff1a;clicked()信号是QAbstractButton类&#xff08;及其子类&#xff0c;如QPushButton、QRadioButton、QCheckBox等&#xff09;的一个信号。clicked信号可以说是许多控件&#xff08;特别是按钮类控件&#xff0c;如QPushButton&#xff09;…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0920)

十三、文章分类页面 - [element-plus 表格] Git仓库&#xff1a;https://gitee.com/msyycn/vue3-hei-ma.git 基本架子 - PageContainer 功能需求说明&#xff1a; 基本架子-PageContainer封装文章分类渲染 & loading处理文章分类添加编辑[element-plus弹层]文章分类删除…

Vue3DevTools7是如何在vscode定位指定文件位置的?

Vue3DevTools7是如何在vscode定位指定文件位置的&#xff1f; 背景 今天在使用vue脚手架创建项目的时候&#xff0c;并发现一个新的&#xff08;实验中的新功能&#xff09;&#xff0c;可以直接在我们的项目中集成Vue DevTools插件&#xff0c;浏览器插件devtools即将成为历史…