初识C语言·自定义类型(1)

目录

1 联合体类型的声明

2 联合体的特点

3 联合体的大小计算

4 枚举类型类型的声明

5 枚举的优点


1 联合体类型的声明

联合体,顾名思义,是多个对象连在一起的,即联合体的成员都是共用空间的,所以联合体也叫做共用体,既然是共用一块空间,那么改变其中一个成员的值的时候,其他对象的值也会随着改变。

联合体用到的关键字是union。

先介绍第一个特性,共用一块空间,

union un
{char a;int b;
};
int main()
{union un tem;printf("%zd\n", sizeof(tem));return 0;
}

联合体里面有一个字符类型,一个整型,整型占4个字节,字符占1个字节,所以会占4个字节。

即编译器只会给占内存最大的成员分配空间。

介绍第二种特性,共用一块空间。

union un
{char a;int b;
};
int main()
{union un tem;printf("%zd\n", sizeof(tem));tem.b = 0x11223344;printf("%x %x", tem.a, tem.b);return 0;
}

因为vs是小端存储,所以存的16进制的11223344,所以存的顺序是44332211,那么a的值就是44,b的值就是11223344。

前面提到的可以用联合体判断机器是大端机器还是小端机器,就是完美利用了联合体的特点,

union un
{char a;int b;
};
int main()
{union un tem;tem.b = 0x11223344;if (tem.a == 11){printf("大端");}else{printf("小端");}return 0;
}

在写联合体的时候,需要注意花括号后面要有分号,定义联合体变量的时候,是需要写union un的,当然,可以直接在花括号后面写,那种写法是表示定义,如下:
 

union un
{char a;int b;
}tem1,tem2;

2 联合体的特点

联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合 ⾄少得有能⼒保存最⼤的那个成员)。

先看一段代码

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

问打印的结果都是一样的吗?

没错是的,这就是说明联合体的存放元素的时候都是从同一块空间开始存的。

因为空间共用,所以我们要修改前文的11223344中的44也是可以的,这里请自行实验咯。

这里稍微引入一点结构体的知识,我们比较一下在相同的成员情况下,结构体和联合体占用的内存多少。

union Un
{int a;char c;int i;
}un;
struct St
{int a;char c;int i;
}st;
int main()
{printf("%zd\n", sizeof(un));printf("%zd\n", sizeof(st));return 0;
}

可以看到,成员有两个char,一个int类型的,所以联合体的大小应该是4,那么结构体的大小是?

是12?!对,确实是12,至于为什么,就下一篇再介绍了,这里涉及到的知识是内存对齐。


3 联合体的大小计算

联合体的大小就一定是最大成员的大小吗?举个例子。

union Un1 
{char c[5];int i;
};
union Un2
{short c[7];int i;
};
int main()
{printf("%zd\n", sizeof(union Un1));printf("%zd\n", sizeof(union Un2));return 0;
}

按刚才的来讲,Un1的大小应该是5,Un2的大小应该是14,让我们来揭晓谜底。

结果是8 16,这是因为最大成员的大小不是最大对齐数的整数倍的时候,系统就会浪费空间去凑到最大对齐数的整数倍,且听下回分解。


4 枚举类型类型的声明

现实生活中比如星期1到星期7,性别,三原色,我们都是可以一一列举的,这就是枚举,将有限个数的元素一一列举出来。

枚举用到的关键字是enum,里面的成员叫做枚举常量,如下:

enum Color
{Red,Blue,yellow
};

注意格式,枚举变量中间是用逗号进行隔开的,且最后是没有分号的,但是花括号的后面依旧是有分号的。

这是枚举的声明,那枚举常量有没有值呢?

答案是有的,并且看来是层层递增的,那么我们如果附上初值呢?

enum Color
{Red = 1,Blue = 3,yellow
};
int main()
{printf("%d ", Red);printf("%d ", Blue);printf("%d ", yellow);return 0;
}

所以可以得出结论,枚举常量的值是递增的,修改之后也是递增的,且默认从0开始递增。

既然枚举常量是整型,是常量,我们可以应用到switch语句里面吗?

enum Color
{Red,Blue,yellow
};
int main()
{switch (Blue){case 0:printf("0");break;case 1:printf("1");break;case 2:printf("2");break;default:break;}return 0;
}

当然是可以的,最后的结果就是1。

枚举常量也是可以用于给枚举常量赋值的。

enum Color clr = Blue;

像这样,但是在C语言里面是可以用整数给枚举常量赋值的,c++里面是不可以的,因为c++的类型检查比较严格,会认为这是两种不同的类型不能进行赋值。


5 枚举的优点

枚举的优点(和define相比):

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

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

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

4. 使⽤⽅便,⼀次可以定义多个常量

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


感谢阅读!

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

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

相关文章

Java开发分析工具 JProfiler的详细使用方法解析(附 JProfiler for Mac许可证秘钥)

JProfiler 是一款功能强大的Java代码分析工具,JProfiler的直观UI可帮助您解决性能瓶颈,确定内存泄漏并了解线程问题且JProfiler Mac破解版配置会话非常简单,第三方集成使得入门变得轻而易举,并且以自然的方式呈现数据分析。 解…

万物简单AIoT 端云一体实战案例学习 之 快速开始

学物联网,来万物简单IoT物联网!! 下图是本案的3步导学,每个步骤中实现的功能请参考图中的说明。 1、简介 物联网具有场景多且复杂、链路长且开发门槛高等特点,让很多想学习或正在学习物联网的学生或开发者有点不知所措,甚至直接就放弃了。    万物简单AIoT物联网教育…

72.批量执行Redis命令的4种方式!

文章目录 前言一、Redis命令执行过程二、原生批量命令三、pipeline(管道)四、Lua脚本五、Redis事务六、Redis Cluster模式下该如何正确使用批量命令操作? 前言 在我们的印象中Redis命令好像都是一个个单条进行执行的,但实际上我们是可以批量执行Redis命…

二层交换机和三层交换机

二层交换机:将源mac和端口进行转发,是同一个网段进行通信的,不能实现路由转发,若想跨网段则需要接入一个路由器 如:pc1 192.168.1.1 与 pc2 192.168.1.2通信需要经过二层交换机,二层交换机不能配置ip的&am…

【前端设计】输入框

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 html <!DOCTYPE html> <html lang"en"> <head><meta charset"…

RHCE上课笔记(前半部分)

第一部分 网络服务 第一章 例行性工作 1.单一执行的例行性工作 单一执行的例行性工作&#xff08;就像某一个时间点 的闹钟&#xff09;&#xff1a;仅处理执行一次 1.1 at命令&#xff1a;定时任务信息 [rhellocalhost ~]$ rpm -qa |grep -w at at-spi2-core-2.40.3-1.el9.x…

Nacos 在云原生架构下的演进

作者&#xff1a;之卫 背景 Nacos 提供的最核心能力是动态服务发现与动态配置管理能力&#xff0c;在云原生环境下&#xff0c;借助云产品&#xff0c;如 EDAS&#xff08;企业级分布式应用服务&#xff09;平台中&#xff0c;我们可以很轻松地使用 K8s 来托管 Nacos 体系的微…

《WebKit 技术内幕》之六(1): CSS解释器和样式布局

《WebKit 技术内幕》之六&#xff08;1&#xff09;&#xff1a;CSS解释器和样式布局 CSS解释器和规则匹配处于DOM树建立之后&#xff0c;RenderObject树之前&#xff0c;CSS解释器解释后的结果会保存起来&#xff0c;然后RenderObject树基于该结果来进行规范匹配和布局计算。当…

基于 GPT 和 Qdrant DB 向量数据库, 我构建了一个电影推荐系统

电影推荐系统自从机器学习时代开始以来就不断发展&#xff0c;逐步演进到当前的 transformers 和向量数据库的时代。 在本文中&#xff0c;我们将探讨如何在向量数据库中高效存储数千个视频文件&#xff0c;以构建最佳的推荐引擎。 在众多可用的向量数据库中&#xff0c;我们将…

Tomcat的maxParameterCountmaxPostSize参数

Tomcat的maxParameterCount&maxPostSize参数 Tomcat的maxParameterCount&maxPostSize参数1.问题1.1问题现象1.2 参数总结1.3 问题总结 2 Tomcat官网的解释2.1 到https://tomcat.apache.org/找到文档入口2.2 找到文档的Reference2.3 查看配置文件的参数 3 文档看不明白&…

GIS项目实战08:JetBrains IntelliJ IDEA 2022 激活

为什么选择 IntelliJ IDEA 使用编码辅助功能更快地编写高质量代码&#xff0c;这些功能可在您键入时搜索可能的错误并提供改进建议&#xff0c;同时无缝地向您介绍编码、新语言功能等方面的社区最佳实践。 IntelliJ IDEA 了解您的代码&#xff0c;并利用这些知识通过在每种上…

Istio

1、Istio介绍 Istio 是由 Google、IBM 和 Lyft 开源的微服务管理、保护和监控框架。 官网&#xff1a;https://istio.io/latest/zh/ 官方文档&#xff1a;https://istio.io/docs/ 中文官方文档&#xff1a;https://istio.io/zh/docs Github地址&#xff1a;https://github.com…

vectorCast添加边界值分析测试用例

1.1创建项目成功后会自动生成封装好的函数,在这些封装好的函数上点击右键,添加边界值分析测试用例,如下图所示。 1.2生成的用例模版是不可以直接运行的,需要我们分别点击它们,让它们自动生成相应测试用例。如下图所示,分别为变化前和变化后。 1.3点击选中生成的测试用例,…

【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 广度优先搜索 状态压缩 LeetCode847 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图&#xff0c;图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中&#xff0c;graph[i] 是一个列…

如何用“VMware安装Ubuntu”win11系统?

一、 下载Ubuntu 企业开源和 Linux |Ubuntu的 二、 安装 三、 启动虚拟机 选中Try or Install Ubuntu Server&#xff0c;按回车

数据结构与算法:图

文章目录 图1) 概念有向 vs 无向度权路径环图的连通性 2) 图的表示3) Java 表示4) DFS5) BFS6) 拓扑排序7) 最短路径DijkstraBellman-FordFloyd-Warshall 8) 最小生成树PrimKruskal 图 1) 概念 图是由顶点&#xff08;vertex&#xff09;和边&#xff08;edge&#xff09;组成…

Mysql学习笔记系列(一)

本次mysql系列不会讲解具体的查询语句&#xff0c;而是放在mysql的一些性能优化和一些特性上&#xff0c;是学习笔记&#xff0c;供大家参考补充。 慢查询 MySQL的慢查询&#xff0c;全名是慢查询日志&#xff0c;是MySQL提供的一种日志记录&#xff0c;用来记录在MySQL中响应…

Meta 标签的力量:如何利用它们提高网站的可见性(上)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

如何在ubuntu22.04安装ROS2

ubuntu22.04安装ROS2 教程 选择对应版本进行安装设置编码添加源安装ROS2设置环境变量 运行ROS2 选择对应版本 通过官方网站&#xff0c;查询Ubuntu与ros对应的版本&#xff0c;版本不一致也会出现安装不成功。 https://wiki.ros.org/ROS/Installation 每一个都可以进行点击&a…

解决电脑文件大小写不敏感问题

第一步&#xff1a;以管理员的身份运行 CMD 第二步&#xff1a; 输入下面命令 fsutil file setCaseSensitiveInfo 路径 enable 路径改成目标文件夹的路径&#xff0c;比如说我也下面 Less-24 这个文件夹里面的文件全部都大小写敏感 这样就 OK 了&#xff0c;注意路径最后要加…