自定义类型:联合和枚举

简介: 自定义类型:联合和枚举

联合体

联合体的特点是所有成员共用同一块内存空间。所以联合体也叫共用体

联合体类型的声明

union Un
{
  int i;
  char ch;
};
 
int main()
{
  union Un p = { 0 };     //联合变量的定义
  printf("%zd\n", sizeof(p)); //计算联合变量的大小
  return 0;
}

注:联合体也类似结构体,结构体中的struct必不可少,同理,联合体中的union必不可少

联合变量的大小

控制台输出:4

为什么呢?我们再来观察联合体中 i 和 ch 的地址

union Un
{
  int i;
  char ch;
};
 
int main()
{
  union Un p = { 0 };     //联合变量的定义
  printf("%zd\n", sizeof(p)); //计算联合变量的大小
  printf("%p\n", &p.i);
  printf("%p\n", &p.ch);
  return 0;
}

控制台输出:

代码结果解释

那还有疑问,为什么这两个的地址要这样做存放呢?

这得谈及我们上面👆说到的联合体的特点;

这里我们具体再说一下联合体的特点:

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


联合体和结构体的对比



联合体的作用


最大作用就是可以节省空间

举个栗子:

价格:price ;类型:type ;大小:size ;标签:label ;颜色:colour

我们可以这样子用联合体:

struct study_set
{
  //公共
  int price;
  char type;
 
  //特殊
  union
  {
    struct
    {
      char colour;  //颜色
    }pencil_book;     //笔盒
 
    struct
    {
      char label;    //标签
    }book;         //书本
 
    struct
    {
      int size;      //大小
    }book_shelf;       //书架
  }item;
};

枚举类型

枚举 -- 把可能的取值一一列举

一个星期有七天--1,2...7;

一年有12个月份--1,2...12


例如一周的天数

注:枚举也像结构体,联合体一样有关键字,枚举的关键字是enum

#include<stdio.h>
//一周的天数
enum Day
{
  Mon,
  Tues,
  Wed,
  Thur,
  Fri,
  Sat,
  Sun
};
 
int main()
{
  printf("%d\n", Mon);
  printf("%d\n", Tues);
  printf("%d\n", Wed);
  //...
  printf("\n");
  printf("%d\n", Sun);
 
  return 0;
}

来看看这段代码输出什么?

以上是编译器设置的最初始默认值,也可以自己设置

#include<stdio.h>
//一周的天数
enum Day
{
  Mon=1,
  Tues=9,
  Wed=10,
  Thur,
  Fri,
  Sat,
  Sun
};
 
int main()
{
  printf("%d\n", Mon);
  printf("%d\n", Tues);
  printf("%d\n", Wed);
  //...
  printf("\n");
  printf("%d\n", Sun);
 
  return 0;
}

控制台输出:1 9 10  14

枚举类型优点

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

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

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

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

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


目录
相关文章
|
安全 编译器 Linux
精伦安全模块-身份证读卡器对接-Qt调用SDK
精伦安全模块-身份证读卡器对接-Qt调用SDK
831 0
|
JavaScript
【登录界面】vue、element-ui登录界面模板
这里总结一个用vue、element-ui写的登录界面,为以后复制粘贴备用
2476 0
【登录界面】vue、element-ui登录界面模板
|
8月前
|
人工智能 自然语言处理 运维
不懂代码照样造网站,老金15万字Claude Code+OpenClaw教程免费开源
春节期间,零代码基础的老金仅凭语音指令,用Claude Code(武器)和OpenClaw(助理)协同打造了全功能网站aiking.dev。现将两套工具中文教程合并升级为《Claude-Code-x-OpenClaw-Guide-Zh》,10万字免费开源,覆盖从造轮子到调度千军万马的完整AI编程路径。
|
10月前
|
消息中间件 人工智能 Apache
定义 AI 时代消息引擎,ApacheRocketMQ 荣获 InfoQ“2025 AI 开源明星项目”
Apache RocketMQ 凭借面向AI应用的事件驱动架构,荣获“2025中国技术力量榜单”AI开源明星项目。其创新推出LiteTopic模型,支持多智能体异步通信、智能任务调度与分布式会话管理,助力AI时代消息引擎演进,已在阿里云等大规模场景验证,并开源核心代码,共建A2A通信生态。
438 2
|
10月前
|
Java 容器 Spring
SpringBoot怎么过滤不需要的组件
Spring Boot中IOC容器确实存在,若不想某些Bean在启动时注入,可通过@ComponentScan指定扫描范围,或自定义TypeExcludeFilter排除特定类,也可在配置文件中设置过滤规则,灵活控制Bean加载。
|
安全 物联网
零压力了解 LoRA 微调原理
`LoRA` 全称为 `Low-Rank Adaptation`,翻译成中文就是`低秩适配`。⊙﹏⊙ 是不是一头雾水?没关系,相信我,看完下文你就会明白个大概了
985 0
零压力了解 LoRA 微调原理
|
数据采集 人工智能 监控
快手电商 API 接口:快手平台电商活动参与度深度分析
快手电商API助力商家深度分析活动参与度,通过实时数据监控与用户行为分析,优化营销策略,提升转化率和用户粘性,实现智能化电商运营。
|
存储 固态存储 算法
固态硬盘损坏后还能做数据恢复吗?完整指南
固态硬盘(SSD)因速度快、抗震动、低噪音被广泛使用,但一旦损坏,用户常因慌乱导致二次损失。本文解析SSD损坏后的数据恢复可行性,介绍逻辑损坏、固件异常、物理损坏三种常见情况,并提供对应的恢复方法与预防措施,帮助用户科学应对数据丢失风险,提升恢复成功率。
|
监控 安全 BI
电商 API 助力,多平台物流信息无缝对接
在电商多平台运营中,物流信息割裂导致效率低下、客服压力大。通过API技术,可实现订单抓取、状态同步与数据聚合,打通电商平台、快递系统与商家ERP,提升运营效率与用户体验。
|
JSON Java 数据格式
使用postMan调试接口出现 Content type ‘multipart/form-data;charset=UTF-8‘ not supported“
本文介绍了使用Postman调试接口时遇到的“Content type ‘multipart/form-data;charset=UTF-8’ not supported”错误,原因是Spring Boot接口默认只接受通过`@RequestBody`注解的请求体,而不支持`multipart/form-data`格式的表单提交。解决方案是在Postman中将请求体格式改为`raw`并选择`JSON`格式提交数据。
使用postMan调试接口出现 Content type ‘multipart/form-data;charset=UTF-8‘ not supported“