学C的第三十天【自定义类型:结构体、枚举、联合】

news2024/11/26 9:46:19

=========================================================================

相关代码gitee自取:C语言学习日记: 加油努力 (gitee.com)

 =========================================================================

接上期

学C的第二十九天【字符串函数和内存函数的介绍(二)】_高高的胖子的博客-CSDN博客

 =========================================================================

                     

1 . 结构体

(1). 结构体的基础知识:

             

结构一些值的集合,这些值称为成员变量

结构的每个成员可以是不同类型的变量

                     


                    

(2). 结构体的声明:

                

struct tag         

{                        

                member - list;

}variable - lest;

                 

                  

struct  --  结构体标签

tag  --  自定义结构名

 member - list  --  成员列表

variable - lest  --  结构体变量列表

                     

实例:

                     


                    

(3). 特殊的声明:

              

匿名结构体:在声明结构时,可以不完全地声明,即声明时省略掉了结构体标签(tag)

                     

实例:

                     


                    

(4). 结构的自引用:

           

结构中包含一个类型为该结构本身的成员(类似递归?)

                

实例:

                     


                    

(5). 结构体变量的定义和初始化:

                

两种 定义 实例:

                 

两种 初始化 实例:

                 

结构体成员列表包含另一个结构体 实例:

                     


                    

(6). 结构体内存对齐(重点):

              

运用于计算结构体大小

           

           

结构体的对齐规则:

          

1. 第一个成员与结构体变量偏移量为0的地址处

                      

2. 其他成员变量对齐到某个数字(对齐数)整数倍地址处

  • 对齐数 = 编译器默认的一个对齐数该成员大小 两者中的较小值
  • VS中默认的值为8,Linux中没有默认对齐数,对齐数就是成员自身的大小

                     

3. 结构体总大小最大对齐数每个成员变量都有一个对齐数)的整数倍

示例:

                   

4. 如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍

示例:

           

           

需要内存对齐的原因:

             

(1). 平台原因(移植原因):

不是所有的硬件平台都能访问任意地址上的任意数据的;

某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

            

(2). 性能原因:

数据结构(尤其是)应该尽可能地在自然边界上对齐

原因在于,为了访问未对齐的内存处理器需要作两次内存访问

对齐的内存访问仅需要一次访问

           

           

总体来说:

结构体的内存对齐拿空间来换取时间的做法

设计结构体的时候,我们既要满足对齐,又要节省空间

让占用空间小的成员尽量集中在一起

                     


                    

(7). 修改默认对齐数:

                

结构对齐方式不合适的时候,我们可以自己更改默认对齐数

使用 #pragma 预处理指令修改默认对齐数

示例:

                 


                    

(8). 结构体传参:

               

函数传参的时候,参数是需要压栈,有时间和空间上的系统开销

如果传递一个结构体对象的时候结构体过大

参数压栈的的系统开销比较大,会导致性能的下降

所以结构体传参的时候,最好传结构体的地址

示例:

            

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

             

2 . 位段(位域)

(1). 什么是位段:

              

位段的声明和结构体是类似的,

有两个不同:

1.位段的成员必须是 intunsigned intsigned int

2.位段的成员名后边有一个冒号一个数字

            

这个数字指这个成员变量所占的二进制位数

限定该成员变量的空间节省内存

             

位段的大小所有的“数字”相加后所需字节数

如果不够字节存储,则加一个单位的字节

示例:

                     


                    

(2). 位段的内存分配:

                 

  • 位段的成员可以是 int, unsigned int, signed int 或者是 char (属于整形家族)类型
  • 位段的空间上是按照需要以4个字节 int )或者1个字节char )的方式来开辟的。
  • 位段涉及很多不确定因素,位段是不跨平台的注重可移植的程序应该避免使用位段

                     

示例:

                     


                    

(3). 位段的跨平台问题:

             

1. int 位段被当成有符号数还是无符号数不确定的

             

2. 位段中最大位的数目不能确定

16位机器最大1632位机器最大32如果写成27在16位机 器会出问题。)

             

3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义

             

4. 当一个结构包含两个位段第二个位段成员比较大无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的

             

总结:

跟结构相比位段可以达到同样的效果,并且可以很好的节省空间

但是有跨平台的问题存在

                     


                    

(4). 位段的运用:

              

网络底层的实现中,

在对数据进行包装时的结构就是使用了位段这种形式来分装的。

           

ip数据包的格式:)

            

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

             

3 . 枚举

枚举顾名思义 一一 列举

把可能的取值列出来 一一 列举

           

比如我们现实生活中:

一周的星期一到星期日是有限的7天可以一一列举

性别有:男、女、保密,也可以一一列举

月份有12个月,可以一一列举

           

这时就可以使用枚举了。

           

(1). 枚举类型的定义:

            

下列示例定义的 enum Color 枚举类型

{}中的内容枚举类型的可能取值,也叫 枚举常量

这些可能取值都是有值的默认从0开始依次递增1

当然在声明枚举类型的时候也可以赋初值

              

示例:

                     


                    

(2). 枚举的优点:

               

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

          

枚举的优点:

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

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

3. 只能拿枚举常量给枚举变量赋值,不会出现类型的差异

3. 便于调试

4. 使用方便一次可以定义多个常量

            

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

             

4 . 联合(共用体)

(1). 联合类型的定义:

        

联合也是一种特殊的自定义类型

这种类型定义的变量包含一系列的成员

特征这些成员公用同一块空间所以联合也叫共用体)。

                     


                    

(2). 联合的特点:

        

联合的成员共用同一块内存空间的,

这样一个联合变量的大小至少是最大成员的大小

,因为联合至少得有能力保存最大的那个成员

              

示例:

(因为联合体成员都共用一个空间,所以同一时间只能使用一个联合体成员

                     


                    

(3). 联合大小的计算:

        

联合的大小至少是最大成员的大小

最大成员大小不是最大对齐数的整数倍候,

要对齐到最大对齐数的整数倍

              

示例:

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

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

相关文章

docker-compose yml配置、常用命令

下载完docker-compose后,如果想使用docker-compose命令开头,需要创建软连接 sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose 1.docker-compose.yml文件编排 一个 docker-compose.yml 文件的顶层元素有&#xff…

线程的同步

一、互斥锁 java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应与一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有 一个线程访问该对象。关键字synchronized用来与对象的互斥锁联系。…

HTML不常用但是好用的标签

sub sup <p>这个文本包含 <sub>111</sub>文本。</p> <p>这个文本包含 <sup>上标</sup> 文本。</p>下标文本将会显示在当前文本流中字符高度的一半为基准线的下方&#xff0c;但是与当前文本流中文字的字体和字号都是一样的。…

Xilinx AXI VIP使用教程

AXI接口虽然经常使用&#xff0c;很多同学可能并不清楚Vivado里面也集成了AXI的Verification IP&#xff0c;可以当做AXI的master、pass through和slave&#xff0c;本次内容我们看下AXI VIP当作master时如何使用。 新建Vivado工程&#xff0c;并新建block design&#xff0c;命…

YOLOv7改进:CVPR 2023 | SCConv: 即插即用的空间和通道重建卷积

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点。 2.涨点效果:添加 SCConv,经过测试,有效涨点。…

【FAQ】关于无法判断和区分用户与地图交互手势类型的解决办法

一&#xff0e; 问题描述 当用户通过缩放手势、平移手势、倾斜手势和旋转手势与地图交互&#xff0c;控制地图移动改变其可见区域时&#xff0c;华为地图SDK没有提供直接获取用户手势类型的API。 二&#xff0e; 解决方案 华为地图SDK的地图相机有提供CameraPosition类&…

labview 信号量实现互斥 避免竞争写

上一篇文章中描述了事件发生、集合点、通知器、信号量。 本文进一步举例描述信号量实现互斥&#xff0c;避免竞争写。 1.不用信号量的例子 图1-不用信号量的结果都不同&#xff0c;不为0 图2-不用信号量的例子&#xff0c;程序框图 2.用信号量的例子 图3-用信号量的例子&…

手工测试如何转向自动化测试

手工测试的迷茫&#xff1a;除了重复劳动&#xff0c;到底还有什么&#xff1f; 我是在2008年毕业的&#xff0c;三本的学校&#xff0c;不上不下的专业水平&#xff0c;毕业的时候&#xff0c;恰好遇到了金融危机。校园招聘里阴差阳错的巧合&#xff0c;让我走上了软件测试工…

运算放大器基础(一)

5.1.1反馈的基本概念 在电子电路中,将 输出量 (输出电压或输出电流)的一部分或全部通过一定的电路形式作用到 输入回路&#xff0c;用来影响其输入量(放大电路的输入电压或输入电流)的措施称为 反馈。具体框图如下&#xff1a;反馈类型判断 正反馈与负反馈 正反馈&…

CHI协议之DVM操作

本文部分内容参考了CHI的Cache Stashing和DVM操作_谷公子的藏经阁的博客-CSDN博客 □ 注意此处RNF发送的noncopyback data, 只有8byte; □ MN会发送两个SNP给每个RNF, 因为一个SNP&#xff0c;携带的信息不够&#xff1b; □ 如果MN具备将来自同一个源头的non-sync/sync dvmop操…

详解Mybatis之自动映射 自定义映射问题

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 文章目录 一、Mybatis中的自动映射是什么&#xff1f;二、Mybatis中的自定义映射是什么&#xff1f;三、为什…

华东师范大学计算机考研分析

关注我们的微信公众号 姚哥计算机考研 更多详情欢迎咨询 华东师范大学&#xff08;B&#xff09;考研难度&#xff08;☆☆☆☆&#xff09; 华东师范大学计算机考研招生学院是计算机科学与技术学院、软件工程学院网址和数据科学与工程学院。目前均已出拟录取名单。 华东师…

前端JS 展示上传图片缩略图(本地图片读取)

需求&#xff1a; 点击上传图片按钮&#xff0c;选择图片以后&#xff0c;不请求后端接口&#xff0c;直接将图片展示在缩略图中。 解决方案&#xff1a; 使用 FileReader 和 FileReader 中的 readAsDataURL 方法。 第一步 从input[type“file”] (上传文件标签) 里面拿到fil…

解密直播美颜SDK和滤镜算法的工作原理:如何实现实时美化效果

直播美颜已成为许多直播平台的核心功能之一。通过美颜技术&#xff0c;主播可以在直播过程中实时改善自己的外貌&#xff0c;给观众带来更好的视觉体验。而实现这一效果的关键在于直播美颜SDK和滤镜算法。 一、美颜SDK的工作原理 美颜SDK是一种集成了美颜算法的软件开发工具包…

亚马逊奥地利卖家出口额创新高!2022年突破5.5亿欧元!

近日亚马逊报告说&#xff0c;2022年奥地利中小企业的出口额达到5.5亿欧元以上&#xff0c;比上一年增长了10%&#xff0c;延续了跨境销售的趋势。去年&#xff0c;奥地利卖家在亚马逊上销售了约2000万件产品。 亚马逊宣称&#xff0c;通过其全球22个站点&#xff0c;奥地利的…

[ 容器 ] consul 容器服务更新与发现

目录 什么是服务注册与发现什么是consulconsul 部署consul 服务器 registrator服务器consul-templateconsul 多节点 什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承…

学习 C语言第二天 :C语言数据类型和变量(下)

目录&#xff1a; 1.变量的介绍以及存储 2.算术操作符、赋值操作符、单目操作符 3.scanf和printf的介绍 1.变量的介绍以及存储 1.1.变量的创建 了解了什么是类型了&#xff0c;类型是用来创建变量的。 变量是什么呢&#xff1f;在C语言当中不经常变的量称为常量&#xff0c;经常…

Python实战项目——O2O_优惠券使用情况分析(五)

O2O优惠券线下使用情况数据分析 一 项目简介 随着移动设备的完善和普及&#xff0c;移动互联网各行各业进入了高速发展阶段&#xff0c;这其中以O2O&#xff08;Online to Offline&#xff09;消费最为吸引眼球。据不完全统计&#xff0c;O2O行业估值上亿的创业公司至少有10家…

【Docker】Docker的服务更新与发现

consul 一、服务注册与发现1. 服务注册与发现的概念2. 服务发现的机制 二、consul 的概念1. 什么是 consul2. consul 的特性 三、consul 的部署1. consul 服务器架构2. consul 的部署过程2.1 环境配置2.2 consul 服务器建立 Consul 服务查看集群信息通过 http api 获取集群信息…

Jenkins 安装构建

一、CentOS 安装 1. 使用该存储库 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key 2. 安装 Java yum install fontconfig java-11-openjdk配…