当前位置: 首页 > news >正文

【C语言基础】:自定义类型(二) -->联合和枚举

文章目录

      • 一、联合体
        • 1.1 联合体类型的声明
        • 1.2 联合体的特点
        • 1.3 相同成员的结构体和联合体对比
        • 1.4 联合体大小的计算
        • 1.5 联合体练习
      • 二、枚举类型
        • 2.1 枚举类型的声明
        • 2.2 枚举的优点

                                                         在这里插入图片描述
         书山有路勤为径,学海无涯苦作舟。
创作不易,宝子们!如果这篇文章对你们有帮助的话,别忘了给个免费的赞哟~

                               在这里插入图片描述

一、联合体

1.1 联合体类型的声明

像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。
但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体

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

// 联合体的声明
union Un
{char c1;int i;
};
#include<stdio.h>
int main()
{union Un u = { 0 };  // 联合变量的定义printf("%zd\n", sizeof(u));  // 计算联合变量的大小return 0;
}

在这里插入图片描述

从运行结果来看:这个联合体中有两个成员变量,一个整形和一个字符型,按理说应该是5个字节的大小,但这个联合体的大小却只有4个字节,这也就是联合体的特点了。

1.2 联合体的特点

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

【代码1】

#include<stdio.h>
union Un
{char c1;int i;
};int main()
{union Un u = { 0 };printf("%zd\n", sizeof(u));printf("%p\n", &u);printf("%p\n", &(u.c1));printf("%p\n", &(u.i));return 0;
}

在这里插入图片描述
【代码2】

#include<stdio.h>
union Un
{char c;int i;
};int main()
{union Un u = { 0 };u.i = 0x11223344;u.c = 0x55;printf("%x\n", u.i);return 0;
}

在这里插入图片描述
代码1输出的三个地址一模一样,代码2的输出,我们发现将i的第4个字节的内容修改为55了。
我们仔细分析就可以画出,un的内存布局图。
在这里插入图片描述
【结论】:联合体的成员是共用同一块内存空间的,修改一个其他的也会被修改。

1.3 相同成员的结构体和联合体对比

我们再对比一下相同成员的结构体和联合体的内存布局情况。

【结构体】

struct S
{char c;int i;
};
struct S s = { 0 };

【联合体】

union Un
{char c;int i;
};
union Un un = { 0 };

在这里插入图片描述

1.4 联合体大小的计算
  • 联合的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
#include<stdio.h>
union Un
{char c[5];int i;
};int main()
{union Un u = { 0 };printf("%zd\n", sizeof(u));return 0;
}

在这里插入图片描述
以这题为例,这个联合体中最大的成员是char c[5],但这个联合体的大小却并不是5个字节的大小,而是8个字节,这说明联合体的大小不全是最大成员的大小。当最大成员的大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。这里char c[5] 就相当于5个char 类型,也就是1个字节,VS的默认值是8,所以对齐数是1,int占4个字节,所以对齐数就是4,所以这个联合体的最大对齐数就是4,但5并不是4的倍数,即要浪费3个字节变为8个字节。

【结论】:联合体的大小也要是最大对齐数的倍数。

使用联合体是可以节省空间的,举例:
比如,我们要搞一个活动,要上线一个礼品兑换单,礼品兑换单中有三种商品:图书、杯子、衬衫。
每一种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。
| 图书:书名、作者、页数
| 杯子:设计
| 衬衫:设计、可选颜色、可选尺寸

这题可以直接用结构体写:

struct gift_list
{// 公共属性int stock_number;  // 库存量double price;  // 价格int item_type;  // 商品类型// 特殊属性char title[20];  // 书名char author[20];  // 作者int num_pages;  // 页数char desgin[30];  // 设计int colors;  // 颜色int sizes;  // 尺寸
};

上述的结构其实设计的很简单,用起来也方便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的大小就会偏大,比较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息是常用的。比如:
商品是图书,就不需要design、colors、sizes。
所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使用联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存。

struct gift_list
{int stock_number;  // 库存量double price;  // 价格int item_type;  // 商品类型union{struct  {char title[20];  // 书名char author[20];  // 作者int num_pages;  // 页数}book;struct{char desgin[30];  // 设计}mug;struct{char desgin[30];  // 设计int colors;  // 颜色int sizes;  // 尺寸}shirt;}item;
};
1.5 联合体练习

写⼀个程序,判断当前机器是大端?还是小端?

#include<stdio.h>
int check_sys()
{union Un{int i;char c;}u;u.i = 1;return u.c;
}int main()
{int ret = check_sys();if (ret == 1)printf("小端\n");elseprintf("大端\n");return 0;
}

在这里插入图片描述

二、枚举类型

2.1 枚举类型的声明

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

enum Day  // 星期
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};enum Sex  // 性别
{MALE,FEMALE,SECRET
};enum Color // 三原色
{RED,GREEN,BLUE
};

以上定义的 enum Dayenum Sexenum Color 都是枚举类型{} 中的内容是枚举类型的可能取值,也叫枚举常量

这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

enum Color // 三原色
{RED,GREEN,BLUE
};int main()
{enum Color color = RED;return 0;
}

枚举常量也是有值的。

#include<stdio.h>
enum Color // 三原色
{RED,GREEN,BLUE
};int main()
{printf("%d\n", RED);printf("%d\n", GREEN);printf("%d\n", BLUE);return 0;
}

在这里插入图片描述
默认值从0开始,往后依次加一,也可以在声明枚举类型的时候也可以赋初值。

enum Color // 三原色
{RED = 5,GREEN,BLUE
};

在这里插入图片描述

enum Color // 三原色
{RED,GREEN = 5,BLUE
};

在这里插入图片描述

2.2 枚举的优点

为什么使用枚举?

学到这里,我们会发现枚举常量和 #define 有点类似,那为什么不直接用 #define 呢?

enum Color // 三原色
{RED,// 0GREEN,// 1BLUE// 2
};#define RED 0
#define GREEN 1
#define BLUE 2

枚举的优点:

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

【示例】:计算器

enum Option
{EXIT,ADD,SUB,MUL,DIV
};int mian()
{int input = 0;printf("请选择:>");scanf("%d", &input);switch (input){case ADD:  // 加法break;case SUB:  // 减法break;case MUL:  // 乘法break;case DIV:  // 除法break;case EXIT:  // 退出break;default:break;}return 0;
}

这样跟有利于我们代码的可读性。
注意:C语言中可以利用整数给枚举变量赋值,但是C++不可以,这是因为C++的类型检查比较严格。

enum Color // 三原色
{RED,// 0GREEN,// 1BLUE// 2
};int main()
{// enum Color color = RED; // TRUE enum Color color = 0;return 0;
}

enum Color color = 0; 这一句虽然在C语言中不会报错,但是在C++中会显示类型不同,无法赋值,就是因为C++的类型检查比较严格。

相关文章:

【C语言基础】:自定义类型(二) -->联合和枚举

文章目录 一、联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合体练习 二、枚举类型2.1 枚举类型的声明2.2 枚举的优点 书山有路勤为径&#xff0c;学海无涯苦作舟。 创作不易&#xff0c;宝子们&#xff01;如果这篇…...

【授时防火墙】GPS北斗卫星授时信号安全防护装置系统

【授时防火墙】GPS北斗卫星授时信号安全防护装置系统 【授时防火墙】GPS北斗卫星授时信号安全防护装置系统 1、装置概述 卫星信号安全防护装置&#xff08;以下简称“防护装置”&#xff09;是一款专门针对卫星导航授时安全的设备。该设备能接收 BD 系统和 GPS 系统卫星信号&am…...

关于 MySQL 优化(详解)

文章目录 关于 MySQL 优化一、硬件方面的优化1、关于 CPU2、关于内存3、关于磁盘 二、MySQL 配置文件1、 default-time-zone8:002、interactive_timeout 1203、wait_timeout 1204、open_files_limit 102405、group_concat_max_len 1024006、usermysql7、character-set-serv…...

Hive详解(5)

Hive 窗口函数 案例 需求&#xff1a;连续三天登陆的用户数据 步骤&#xff1a; -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…...

阿里云效codeup如何执行github flow工作流

在阿里云效中执行 GitHub 工作流&#xff0c;实质上是在使用 Git 进行版本控制的过程中遵循 GitHub Flow 的原则。GitHub Flow 是一种简洁高效的工作流程&#xff0c;特别适用于追求快速迭代的团队。下面是在阿里云效中执行 GitHub 工作流的基本步骤&#xff1a; 1. 准备工作 …...

node.js的模块化 与 CommonJS规范

一、node.js的模块化 (1)什么是模块化&#xff1f; 将一个复杂的程序文件依据一定的规则拆分成为多个文件的过程就是模块化 在node.js中&#xff0c;模块化是指把一个大文件拆分成独立并且相互依赖的多个小模块&#xff0c;将每个js文件被认为单独的一个模块&#xff1b;模块…...

RK3588平台开发系列讲解(PWM开发篇)

目录 前⾔ 驱动文件 DTS 节点配置 PWM 流程 PWM 使⽤ 常⻅问题 PWM 在 U-Boot 与 kernel 之间的衔接问题 PWM Regulator 时 PWM pin 脚上下拉配置问题 前⾔ 脉宽调制&#xff08; PWM &#xff0c; Pulse Width Modulation &#xff09;功能在嵌⼊式系统中是⾮常常⻅的…...

宝塔面板操作一个服务器域名部署多个网站

此处记录IP一样&#xff0c;端口不一样的操作方式&#xff1a; 宝塔面板操作&#xff1a; 1、创建第一个网站&#xff1a; 网站名用IP地址&#xff0c;默认80端口。 创建好后&#xff0c;直接IP访问就可以了。看到自带的默认首页 2、接下来部署第二个网站&#xff1a; 仍然是…...

surfer绘制等值线图

surfer介绍 Surfer软件&#xff0c;是美国Golden Software公司编制的一款以画三维图的软件。该软件具有强大的插值功能和绘制图件能力&#xff0c;可用来处理XYZ数据&#xff0c;是地质工作者常用的专业成图软件&#xff08;来源于百度百科&#xff09;。 surfer可以用来绘制…...

免费开源的 AI 绘图工具 ImgPilot

免费开源的 AI 绘图工具 ImgPilot 分类 开源分享 项目名: ImgPilot -- 通过提示词及涂鸦生成图片 Github 开源地址&#xff1a; GitHub - leptonai/imgpilot: Turn the draft into amazing artwork with the power of Real-Time Latent Consistency Model 在线地址&#xff…...

Java系统架构设计:构建稳定高效的软件基石

在当今数字化时代&#xff0c;软件系统的稳定性、可扩展性和性能至关重要。Java作为一种广泛应用的编程语言&#xff0c;其系统架构设计对于软件的成功实施具有决定性的影响。本文将探讨Java系统架构设计的重要性以及设计过程中的关键要素。 首先&#xff0c;Java系统架构设计…...

【IntermLM2】学习笔记

微调方式 在大模型的下游应用中&#xff0c;可以有两种微调方式 增量续训 即无监督的方式&#xff0c;让模型学习一些新知识&#xff0c;比如某些垂直领域的新知识 使用的数据有&#xff1a;书籍&#xff0c;文章&#xff0c;代码等有监督微调 为了让模型学会理解指令进行对话…...

【二叉树】Leetcode 230. 二叉搜索树中第K小的元素【中等】

二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 示例1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1a;1 解…...

JS中常用的几种事件

在js中分为多种事件&#xff0c;比如点击事件&#xff0c;焦点事件&#xff0c;加载事件&#xff0c;鼠标事件等等... ... 点击事件 onclick点击事件&#xff0c;ondblclick双击事件 焦点事件 onblur元素失去焦点&#xff0c;onfocus元素获取焦点 加载事件 onload一个页面…...

Android WebView的使用与后退键处理

目录 前言首先&#xff0c;我们需要在布局文件中添加webView组件在Activity中获取webView实例&#xff0c;并加载网页内容 前言 webView是Android中常用的组件之一&#xff0c;用于展示网页内容。它可以加载HTML文件、URL链接等网页内容&#xff0c;并提供交互功能。在使用webV…...

【备忘录】Docker 2375远程端口安全漏洞解决

最近为了项目需要&#xff0c;把docker 的远程端口2375 给开放了。不出意外出意外了。没多久&#xff0c;网站报流量告警&#xff0c;第一反应就是开放2375这个端口问题导致&#xff0c;毫不迟疑直接切换服务器。关闭该台服务器的docker服务&#xff0c;并逐步清理掉挖矿进程&a…...

343. 整数拆分(力扣LeetCode)

文章目录 343. 整数拆分题目描述动态规划 343. 整数拆分 题目描述 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释:…...

Spring面试题系列-3

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而&#xff0c;Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言&#xff0c;绝大部分Java应用都可以从Spring中受益。 Spring的属性…...

【比特币】比特币的奥秘、禁令的深层逻辑与风云变幻

导语&#xff1a; 比特币(Bitcoin)&#xff0c;这个充满神秘色彩的数字货币&#xff0c;自诞生以来便成为各界瞩目的焦点。它背后所蕴含的Mining机制、禁令背后的深层逻辑以及市场的风云变幻&#xff0c;都让人欲罢不能。今天&#xff0c;我们将深入挖掘比特币的每一个角落&…...

【情感分析概述】

文章目录 一、情感极性分析概述1. 定义2. 情感极性的类别3. 应用场景 二、情感极性分析的技术方法1. 基于规则的方法a. 关键词打分b. 情感词典的使用 2. 基于机器学习的方法a. 监督学习方法b. 深度学习方法 三、Python进行情感极性分析 一、情感极性分析概述 情感极性分析&…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...