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

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、枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用

相关文章:

  • [ctfshow web入门] web75
  • 【落羽的落羽 C++】进一步认识模板
  • 代驾小程序订单系统框架搭建
  • 18.中介者模式:思考与解读
  • Android Studio中Gradle中Task列表显示不全解决方案
  • 多平台图标设计与管理的终极解决方案
  • 【linux】open欧拉安装显卡驱动以及cuda12.8
  • 制造业工厂的三大核心系统:ERP+PLM+MES
  • springboot AOP中,通过解析SpEL 表达式动态获取参数值
  • 使用WebSocket实现跨多个服务器传输音频及实时语音识别
  • spark和hadoop之间的区别和联系
  • 以项目的方式学QT开发(一)
  • VisionPro斑点寻找工具Blob
  • MyBatis:从入门到深度理解
  • 深度解析 IDEA 集成 Continue 插件:提升开发效率的全流程指南
  • 【python基础知识】Day26 函数
  • Yeoman实战指南:从零打造自定义项目生成器
  • 人工智能100问☞第23问:卷积神经网络(CNN)为何擅长图像处理?
  • 最新网盘资源搜索系统,电视直播,Alist聚合播放
  • QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示(实操部分)
  • 视频网站开发策划书/安卓aso优化排名
  • 建设银行忘记密码网站首页/seo顾问服务
  • 地产设计网站/最新国际新闻
  • 帮外贸供应商推广网站/优化设计七年级下册数学答案
  • 开通网站必须做域名空间/如何提高网站在百度的排名
  • 合肥做网站的企业/电商网站运营