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

第21讲:自定义类型:联合和枚举

1.联合体

1.1 联合体类型声明

  • 像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以是不同的类型。
  • 联合体的关键字是:union
  • 但是编译器只为最大的成员分配足够的内存空间。
  • 特点:所有成员共用同一块内存空间。所以联合体也叫:共用体
  • 给联合体其中一个成员赋值,其他成员的值也跟着变化。

1.2 特点

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

// 结构体structS{charc;// 1inti;// 4};// 联合体unionUn{charc;inti;};intmain(){unionUn un={0};printf("%zu\n",sizeof(un));// 4printf("%p\n",&un);printf("%p\n",&(un.c));printf("%p\n",&(un.i));un.i=0x11223344;un.c=0x55;return0;}/* printf("%p\n", &un); printf("%p\n", &(un.c)); printf("%p\n", &(un.i)); 结果是一样的地址 */

1.3 联合体大小的计算

  • 联合的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
  • 联合体是可以节省空间的。
unionUn1{charc[5];// 5 -- 数组是按照元素对齐的inti;// 4};unionUn2{shortc[7];// 14inti;// 4}intmain(){printf("%zu\n",sizeof(unionUn1));// 8printf("%zu\n",sizeof(unionUn2));// 16return0;}

1.4 联合体的练习

我们要搞一个活动,要上线一个礼品兑换单,礼品兑换单中有三种商品:图书、杯子、衬衫。
每一种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。
图书:书名、作者、页数
杯子:设计
衬衫:设计、可选颜色、可选尺寸

// 结构体定义structgift_list{// 公共属性intstock_number;// 库存量doubleprice;// 定价intitem_type;// 商品类型// 特殊属性chartital[20];// 书名charauthor[20];// 作者intnum_age;// 页数chardesign[20];// 设计intcolor;// 颜色intsize;// 尺寸};// 联合体的应用structgift_list{intstock_number;// 库存量doubleprice;// 定价intitem_type;// 商品类型union{struct{chartital[20];// 书名charauthor[20];// 作者intnum_age;// 页数}book;struct{chardesign[20];// 设计}mug;struct{chardesign[20];// 设计intcolor;// 颜色intsize;// 尺寸}shirt;}item;};

1.5 练习:判断程序是大端还是小端?

// 联合的练习:写一个程序,判断当前机器是大端?还是小端?intcheck_sys(){union{inti;charc;}un;un.i=1;returnun.c;// 返回1是小端,返回0是大端}intmain(){if(check_sys()==1)printf("小端\n");elseprintf("大端\n");return0;}

2.枚举类型 -enum

2.1 枚举类型的声明

  • 枚举顾名思义就是一一列举
  • 把可能得取值一一列举,比如生活中一个星期的周一到周日是有限的7天可以一一列举。
  • {}中的内容是枚举类型的可能取值,也叫枚举常量
  • 这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。
enumSEX{MALE,// 0FEMALE,// 1SECRET// 2};enumColor{RED=5,// 5GREEN,// 6BLUE// 7};enumColor{RED,// 0GREEN,// 1BLUE=6// 6}

2.2 枚举类型的优点

  • 为什么使用枚举?
    1. 可以使用#define定义常量,为什么非要使用枚举?
  • 优点:
    1. 增加代码的可读性和可维护性。
    2. #define定义的标识符比较枚举有类型检查,更加严谨。
    3. 便于调试,预处理阶段会删除#define定义的符号。
    4. 使用方便,一次可以定义多个常量。
    5. 枚举常量是遵循作用域规则的,枚举类型在函数内,只能在函数内使用。
#defineMALE2#defineFEMALE4#defineSECRET6enumSex{MALE=2,FEMALE=4,SECRET=6};// 使用枚举常量给枚举变量赋值enumSexs=MALE;

注意

C语言是可以拿整数给枚举变量赋值的,但是C++是不行的,C++的类型检查比较严格。

http://www.gsyq.cn/news/1640635.html

相关文章:

  • LeRobot + LIBERO 机器人仿真评估全流程:模型下载、环境搭建与踩坑指南
  • Mi-Create终极教程:免费打造小米手表专属表盘的完整指南
  • 系统安全核心要素——构建“铜墙铁壁“的系统
  • Zed 新特性:Git面板视图重构,像VS Code看齐了。
  • 编译原理:高级程序语言的定义
  • 二极管、三极管、mos管
  • QA-GraphRAG:面向多跳推理的查询自适应即插即用检索框架
  • 会议复盘小知识:结构化导图梳理会议内容的技巧
  • 202638读书笔记|《商场B1,挤满“白吃白喝”的年轻人》——白吃白喝,热闹背后并非单纯的慷慨,免费的才是最贵的
  • APK安装器:在Windows上无缝安装安卓应用的终极解决方案
  • Appium移动端自动化测试入门:环境搭建、脚本编写与实战指南
  • Android 高级工程师面试:Java 多线程与并发 近1年高频追问 22 题
  • 接口测试全流程解析:从核心原理到Postman、JMeter、Apifox实战
  • GetQzonehistory:如何一键完整导出QQ空间说说并永久保存青春回忆
  • 终极Windows系统优化神器:五分钟让你的电脑焕然一新
  • 小小五子棋
  • 从PCF到Xenium:空间蛋白组与空间转录组如何互补解析GBM组织生态
  • 抖店一件代发怎么做?抖掌柜一键下单保姆级实操教程
  • 【信息科学与工程学】【制造工程】第八十七篇 制造工程中的热学01
  • 神经肿瘤免疫研究如何设计空间蛋白组课题?从Cell案例看PCF80应用
  • Fate/Grand Automata:终极Android自动化工具,告别FGO重复刷本
  • 【每天认识一个国家 | 摩洛哥】
  • 鸿蒙物理 108 篇 第六十八篇 五行反向相克机理
  • leecodecode【面试150】【2026.7.2打卡-java版本】
  • 为什么内向者会“话题终结者”?
  • UI自动化测试方案调研:从概念到落地的完整决策指南
  • VLC Android电视版深度配置:打造专业级智能电视媒体中心的7个关键步骤
  • 一线老师傅经验谈:选对海绵喷胶源头厂家,粘接寿命延长8年
  • YouTube AI 助手存在提示注入风险,点击链接或致创作者私人视频标题泄露!
  • Dify 本地化部署指南(全平台)