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

C语言_自动义类型:联合和枚举

1. 联合体

1.1 联合体类型的声明

与结构体相似,联合体也是有一个或多个成员(可以是不同类型)构成;但是编译器只为最大的成员分配足够的内存空间

联合体的特点是所有成员共用同一块内存空间,所以联合体也叫:共用体
声明方式如下:

#include<stdio.h>union Un
{char c;int i;
};int main()
{union Un un={0};printf("%d",sizeof(un));//输出为 4return 0}

1.2 联合体的特点及使用场景

为了保存联合体最大成员的数据,它的内存空间至少是最大成员的内存大小

为了便于理解,下面有俩段代码供大家分析:
代码1:

#include<stdio.h>union Un
{char c;int i;
};int main()
{union Un un={0};printf("%p\n",&(un.c));// 输出 001AF22Cprintf("%p\n",&(un.i));// 输出 001AF22Cprintf("%p\n",&un);    // 输出 001AF22Creturn 0;
}

代码2:

#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); //输出 11223355return 0;
}

给大家一个联合体使用场景,体会一下它存在的意义:
比如我们要上线一个礼品兑换单,礼品兑换单中有三种商品:图书、杯子、衬衫;这三种商品的共用信息有:库存量、价格
而除了这两个信息之外还有各种商品特有的性质,如:
图书:书名、作者
杯子:可选颜色
衬衫:可选颜色、可选尺寸
这时要是用结构体,那就得包含每种商品的所有私有属性,会大大占用内存,而用联合体就会避免内存的浪费,见下方代码:

struct gift_list
{int stock_number;//库存量double price;//价格union {struct{char title[20];//书名char author[20];//作者}book;struct{char colors;//颜色}mug;struct{char colors;//颜色int sizes;//尺寸}shirt;}item;
};

1.3 结构体和联合体的内存分布对比

我们先给出一个相同成员的结构体和联合体:

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

他们的内存分布如图所示:
在这里插入图片描述

1.4 利用联合判断系统大小端

附上代码:

int check_sys()
{union{int i;char c;}un;un.i=1;return un.c;// 返回1是小端,返回0是大端
}

2. 枚举

2.1 枚举类型的声明

枚举顾名思义就是列举的意思,把可能的取值一一列举。
比如:

enum Day
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};enum Sex
{MALE,FEMALE,SECRET
};

2.2 枚举类型的使用

enum Color
{RED=0,GREEN=2,BLUE=4
};enum Color clr=GREEN;//使用枚举常量给枚举变量赋值

在C语言中可以给枚举变量赋值整数,在C++中不可以

2.3 枚举类型的优点

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

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

http://www.xdnf.cn/news/6280.html

相关文章:

  • CK3588下安装linuxdeployqt qt6 arm64
  • 前端流行框架Vue3教程:17. _组件数据传递
  • 最新版VSCode通过SSH远程连接Ubuntu 16.04等旧版Linux的方法
  • 数据结构(九)——排序
  • Coze 实战教程 | 10 分钟打造你的AI 助手
  • Flutter——数据库Drift开发详细教程(六)
  • 【python基础知识】Day26 函数
  • Digi XBee XR 系列介绍
  • 如何在Firefox火狐浏览器里-安装梦精灵AI提示词管理工具
  • Spring MVC 接口的访问方法如何设置
  • Nginx与Tomcat负载均衡集群配置指南
  • IntelliJ IDEA 集成AI编程助手全解析:从Copilot到GPT-4o Mini的实践
  • 力扣.1471数组的k个最强值,力扣.1471数组的k个最强值力扣1576.替换所有的问号力扣1419.数青蛙​编辑力扣300.最长递增子序列
  • Spring框架核心技术深度解析:JDBC模板、模拟转账与事务管理
  • 【Vue】CSS3实现关键帧动画
  • 快速通关单链表秘籍
  • GPU与NPU异构计算任务划分算法研究:基于强化学习的Transformer负载均衡实践
  • Java实现MinIO上传PDF文件并配置浏览器在线打开及vue2上传页面
  • PCIe数据采集系统
  • 解决:npm install报错,reason: certificate has expired
  • 【python实用小脚本-63】每天花费2小时修复黑白照片,Python一键转换,节省90%时间(建议收藏)
  • 【hadoop】Flume的相关介绍
  • Trae - 国人Cursor的免费平替产品
  • idea经常卡顿解决办法
  • ctfshow权限维持
  • 城市扫街人文街头纪实胶片电影感Lr调色预设,DNG/手机适配滤镜!
  • 2025 Java 微信小程序根据code获取openid,二次code获取手机号【工具类】拿来就用
  • 力扣-46.全排列
  • 嵌入式培训之数据结构学习(三)gdb调试、单向链表练习、顺序表与链表对比
  • RPC协议及库介绍