C语言之自定义类型:联合和枚举

目录

    • 1. 联合体类型的声明
    • 2. 联合体的特点
    • 3. 联合体大小的计算
      • 联合的一个练习
    • 4. 枚举类型的声明
    • 5. 枚举类型的优点
    • 6. 枚举类型的使用

1. 联合体类型的声明

像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型

但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体

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

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>//联合类型声明
union u
{char c;int i;
};int main()
{//联合变量的定义union u uu = { 0 };//计算变量的大小printf("%d\n", sizeof(uu));//4return 0;
}

最终的结果为什么是4呢?

在这里插入图片描述

2. 联合体的特点

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

union Un
{char c;int i;
};int main()
{union Un un = { 0 };printf("%p\n", &( un.c));printf("%p\n", &(un.i));printf("%p\n", &(un));return 0;
}

在这里插入图片描述

指向的地址都是同一个

3. 联合体大小的计算

  • 联合的大小至少是最大成员的大小
  • 当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍
union u1
{char c[5];//5int i;//4
};union u2
{short c[7];//14int i;//4
};int main()
{printf("%zd\n", sizeof(union u1));//8printf("%zd\n", sizeof(union u2));//16
}

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

图书:书名、作者、页数
杯子:设计
衬衫:设计、可选颜色、可选尺寸

那我们不耐心思考,可以写出一下结构

struct gift
{//公共属性int num;//库存量int price;//价格char tyoe;//商品类型//特殊属性char title[20];//书名char author[10];//作者int pag_num;//页数char design[30];//设计int color;//可选颜色int sizes;//可选尺寸
};

上述的结构其实这几的很简单,用起来也方便,但是结构的设计包含了所有礼品中的各种属性,液氧使得结构体大小就会偏大,比较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息是常用的。比如:

商品是图书,就不需要desgin、color、sizes

所有我们就可以把公共属性单独写出来,剩余各种商品本身的属性使用联合体起来,这样就可以介绍所需的内存空间,一定程度上节省了内存。

struct gift
{//公共属性int num;//库存量int price;//价格char tyoe;//商品类型union{struct {char title[20];//书名char author[10];//作者int pag_num;//页数}books;struct{char design[20];//设计}cup;struct{char design[20];//设计char color;//颜色int sizes;//尺寸}shirt;}all;
};

联合的一个练习

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

int mine()
{union {int i;char c;}un;un.i = 1;return un.c;
}int main()
{int ret = mine();if (ret == 1){printf("小端");}else {printf("大端");}

4. 枚举类型的声明

枚举顾名思义就是一 一列举

把有可能的取值 一 一列举

比如我们现实生活中:
一周的星期一到星期日是有限的7天,可以一一列举
性别有:男、女、保密,也可以一一列举
三原色,也是可以一一列举的

这些数据的表示就可以使用枚举了。

//枚举的关键字
enum sex
{//这里列举枚举enum sex的可能取值//这些可能取值是常量,也叫枚举常量MALE,FEMALE,SECRET
};int main()
{printf("%d\n", MALE);//0printf("%d\n", FEMALE);//1printf("%d\n", SECRET);//2enum sex s = MALE;return 0;
}

{}中的内容时枚举类型的可能取值,也叫枚举常量
这些可能取值都是有值得,默认从0开始,一次增1,当然在声明枚举类型的时候也可以赋初值

enum color
{RED=2,GREEN=4,BLUE=8
};

5. 枚举类型的优点

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

枚举的优点:

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

6. 枚举类型的使用

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/671806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vCenterServer部署

一、硬件配置 vCenterServer本身最低的硬件要求是14GB&#xff0c;而vCenterServer则是以虚拟机的形式安装在ESXi中的虚拟机&#xff0c;所以ESXi的最低硬件要求是15.5GB&#xff0c;就是15872MB 二、安装vCenterServer 直接解压VMware-VCSA-all-8.0.0-20920323.iso&#xf…

TDengine用户权限管理

Background 官方文档关于用户管理没有很详细的介绍&#xff0c;只有零碎的几条&#xff0c;这里记录下方便后面使用。官方文档&#xff1a;https://docs.taosdata.com/taos-sql/show/#show-users 1、查看用户 show users;super 1&#xff0c;表示超级用户权限 0&#xff0c;表…

python实现飞书群机器人消息通知

python实现飞书群机器人消息通知&#xff08;消息卡片&#xff09; 直接上代码 """ 飞书群机器人发送通知 """ import time import urllib3 import datetimeurllib3.disable_warnings()class FlybookRobotAlert():def __init__(self):self.web…

【0258】pg内核支持的所有 inval messages 类型

1. inval messages类型 pg内核中&#xff0c;共支持几种类型的共享无效消息&#xff1a; &#xff08;1&#xff09;使特定catcache中的特定元组无效&#xff08;2&#xff09;使给定系统目录中的所有catcache项无效&#xff08;3&#xff09;使特定逻辑关系表的relcache条目…

一道sql注入的ctf题目致使用phpmyadmin上传 webshell 拿后台权限

以下均为靶场测试环境渗透&#xff0c;非正式环境。 遇见登录框&#xff0c;直接万能密码’or(11)or’/1 直接登录成功并返回结果: 既然存在sql注入&#xff0c;那就用sqlmap跑一下吧&#xff1a; 输出所有的数据库&#xff1a; sqlmap -u <目标URL> --dbs 要输出数据库…

代码随想录算法训练营第四十二天 | 416. 分割等和子集

题目链接&#xff1a;416. 分割等和子集 文章讲解&#xff1a;代码随想录 416. 分割等和子集讲解 视频讲解&#xff1a;动态规划之背包问题&#xff0c;这个包能装满吗&#xff1f;| LeetCode&#xff1a;416.分割等和子集 思路和解法 题目&#xff1a; 给你一个 只包含正整…

Android Button background 失效

问题 Android Button background 失效 详细问题 笔者开发Android项目&#xff0c;期望按照 android:background中所要求的颜色展示。 实际显示按照Android 默认颜色展示 解决方案 将xml的Button 组件修改为<android.widget.Button> 即将代码 <Buttonandroid:l…

「云原生可观测团队」获选「InfoQ 年度技术内容贡献奖」

随着云原生、人工智能逐渐成为各行各业的创新生产力工具。可以预见&#xff0c;我们即将进入全新的智能化时代。随着数据成为新型生产要素&#xff0c;云和 AI 正走向深度融合。云原生通过提供大规模多元算力的高效供给&#xff0c;可观测成为业务创新的核心基础设施&#xff0…

CSS伸缩盒模型

CSS伸缩盒模型 伸缩盒模型是CSS中的一种布局手段&#xff0c;可以使元素具有弹性&#xff0c;让元素可以跟随页面大小的改变而改变。 1. 伸缩容器 给元素设置display:flex 或 display:inline-flex &#xff0c;就是伸缩容器。 2. 主轴与侧轴 主轴&#xff1a; 伸缩项目沿着…

python coding with ChatGPT 打卡第17天| 二叉树:找树左下角的值、路径总和

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树&#xff1a;理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树&#xff1a;翻转…

SpringBoot+随机盐值+双重MD5实现加密登录

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、salt…

阿里云游戏服务器收费价格表,一年和1个月报价

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

Linux系统调试课:硬件断点

沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在linux内核编程中,经常会遇到由于内存被篡改,例如 buffer overflow,野指针,write after free等。查找分析此类问题非常的麻烦。 一、什么是硬件断点 硬件断点,是Linux内核中是一种被ptrace和内核内调试器使用调试…

Codeforces Round 923 (Div. 3) A - E

CF1927A Make it White 代码如下&#xff1a; //朴素版 #include<bits/stdc.h> using namespace std; using ll long long; const ll N 200005; #define inf 0x7fffffff void solve() {ll n;cin>>n;string a;cin>>a;ll x-1,y0;a a;for(ll i1;i<n;i){i…

【数据分享】1929-2023年全球站点的逐月平均降水量(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;说到常用的降水数据&#xff0c;最详细的降水数据是具体到气象监测站点的降水数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全…

为什么要用建造者模式

因为如果不使用建造者模式&#xff0c;使用一个类时&#xff0c;类中可能会创建很多重载的构造方法。 当使用了建造者模式&#xff0c;使用一个类时&#xff0c;可以选择性地给对象的属性赋值&#xff0c;避免类中可能会创建很多重载的构造方法。 以下是最简单的例子&#xff…

Spring Security 4.X(XML文件配置session超时,单点登录-session并发控制,退出/logout)

目录 前言 一、Java web设置session超时 二、session并发控制 三、退出/logout设置 前言 本文是继SSM项目集成Spring Security 4.X版本&#xff08;使用spring-security.xml 配置文件方式&#xff09;_spring security4.x 会话管理配置文件版-CSDN博客https://blog.csdn.ne…

6.Swift字面量

Swift 字面量 在 Swift 中&#xff0c;字面量是指直接指定数值、字符串、布尔值等常量的值的表示方式。使用字面量可以直接在代码中指定常量的值&#xff0c;而不需要通过变量或常量来存储。Swift 支持多种类型的字面量&#xff0c;包括整数、浮点数、布尔值、字符串、数组、字…

作业2024/2/6

第五章 静态成员与友元 一、填空题 1、一个类的头文件如下所示&#xff0c;num初始化值为5&#xff0c;程序产生对象T&#xff0c;且修改num为10&#xff0c;并使用show()函数输出num的值10。 #include <iostream.h> class Test { private: static int num; publi…

Oracle的权限

通过用户登录plsql工具后&#xff0c;如果在创建视图(或其他对象)时&#xff0c;没有指明视图或对象的用户&#xff0c;该视图或对象将直接创建在当前登录用户下。 GRANT SELECT ON user2.table1 TO user1;//将用户2的表1的select权限给用户1 GRANT ALL ON user2.table1 TO u…