结构体(自定义类型)

1.结构体

结构体这种自定义的数据类型,让程序员可以自己创造适合的类型

结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量,可以是标量,数组,指针甚至是其他结构体

1.1.1 结构的声明

                                                                                 eg:描述一个学生:

struct  tag                                                                   struct  Stu

{                                                                                   {

      member - list;                                                                 char  name[20];

}variable - list;                                                                       int  age;

                                                                                             char  sex[5];

                                                                                      };

1.1.2 结构体变量的创建(定义)和初始化

1.2结构的特殊声明

匿名结构体类型

如果没有对结构体类型重命名,基本上只能使用一次

这个类型是没有名字的,但我们创建变量x

1.3 结构体的自引用

在结构中包含一个类型为该结构本身的成员的不可行的,因为一个结构体中再包含一个同类型的结构体变量,这样结构体变量的大小就会无穷的大,是不合理的

正确的方法:结构体里面有一个同类型的结构体指针

2.结构体内存对齐

2.1对齐规则

1.不管哪种类型的结构体类型,第一个成员都要放到偏移量为0的位置处,从0开始

1.1偏移量

      offsetof -- 宏

      计算结构体成员相较于结构体变量起始位置的偏移量

相关:

https://cplusplus.com/

2.1其他成员对齐到某个数字(对齐数)的整数倍的地址处

对齐数=编译器默认的一个对齐数与该成员变量大小的较小值

-VS中默认的值为8

-Linux中gcc没有默认对齐数,对齐数就是成员自身的大小

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

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

画图表示

1.

2.

3.

4.

2.2为什么存在内存对齐

1)不是所有的硬件平台都能访问任意地址上的任意数据的,某些硬件平台只能在某些地址处取某些特定类型的数据,否则出现硬件异常

2)为了访问未对齐的内存,处理器需要做两次内存访问

而对齐的内存访问仅需一次。

假设一个处理器总是从内存中取8个字节,则地址必须是8的倍数。

如果我们能保证所有的double类型的数据的地址都对齐成8的倍数,那么就可以用一个内存操作来读或者写值了,否则,我们可能需要执行两次内存访问,因为对象可能被分别放在两个8字节内存块中

结构体的内存对齐是拿空间换取时间的做法(对齐提升访问效率)

在设计结构体的时候,我们既要满足对齐又要节省空间时则应该让占用空间小的成员尽量集中在一起

2.3 关于默认对齐数

#pragma 这个预处理指令可以改变编译器的默认对齐数,结构体在对齐方式不合适的时候,我们可以自己更改默认对齐数

3.结构体传参

结构体传参的时候,要传结构体的地址

传值调用时,形参传给实参的时候,实参要创建一份自己的空间,如果结构体比较大则需要比较大的空间,同时传过去也是需要时间的。传地址能够做到的更多

4.结构体实现位段

4.1位段是什么

位段是和结构体相关

位段中的位指的是二进制的位

                              bit位

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

不同:

1)位段的成员必须是int,unsigned int,signed int

      在C99中位段成员的类型也可以选择其他类型

2)位段的成员名后面有一个冒号和一个数字

A(1)就是一个位段类型

   

和结构相比,位段可以达到同样的效果,并且可以很好的节省空间,但是存在跨平台问题

4.2位段的内存分配

1)位段的成员可以是int,unsigned int,signed int,或者是char等类型

2)位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的

3)位段涉及很多不确定因素,位段是不跨平台的,可以移值的程序应该避免使用位段

举个例子

分析:

4.3位段的跨平台问题

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

2)位段中最大位的数目不能确定(16位机器最大16,32位机器最大32,写成27时,在16位机器下会出问题)

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

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

4.4位段的应用

网络协议中,IP数据报格式,我们可以知道很多属性只需要几个bit位就能描述,这里使用位段能实现想要的效果,同时也节省了空间

4.5位段使用的注意事项

位段中的位是bit位,一个字节8个bit位,位段的几个成员共1同一个字节,这样有些有些成员的起始位置并不是某个字节的起始位置,那么这些位置是没有地址的。

内存中每个字节分配一个地址,一个字节内部的bit位是没有地址的

所以不能对位段中的成员使用&操作符,这样就不能使用scanf直接给位段的成员输入值,只能是先输入放在一个变量中,然后赋值给位段的成员

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自定义数据集上的3D目标检测:使用OpenPCDet训练CenterPointPillar模型

前言 在自动驾驶和机器人领域,3D目标检测是关键技术之一。它能够提供关于周围环境中物体的精确位置和尺寸信息。OpenPCDet是一个基于PyTorch的开源3D目标检测框架,支持多种3D检测网络。在本文中,我们将探讨如何使用OpenPCDet框架和CenterPoi…

QT截图程序,可多屏幕截图二,增加调整截图区域功能

上一篇QT截图程序,可多屏幕截图只是实现了最基本的截图功能,虽然能用但是缺点也有,没办法更改选中的区域,这在实际使用时不太方便。这篇增加了这个功能。先看看效果。 实现代码为: 头文件 #ifndef MASKWIDGET_H #de…

Kong网关的负载均衡

安装java环境 查询 java安装包 196 yum list java* 安装java8197 yum install -y java-1.8.0-openjdk.x86_64 检验java8是否安装成功。198 java -version2个tomcat准备 另外一个tomcat区别在于:配置文件。conf/server.xml 启动tomcat [rootlocalhost bin]# ./…

深度学习——卷积神经网络

卷积神经网络 1.导入需要的包2.数据导入与数据观察3.卷积层4.汇聚层最大汇聚 平均汇聚全局平均汇聚 5.搭建卷积神经网络进行手写数字识别导入并对数据进行预处理搭建卷积神经网络 6.利用函数式API与子类API搭建复杂神经网络残差层 1.导入需要的包 numpy as np: NumPy是一个用于…

新火种AI|寻求合作伙伴,展开豪赌,推出神秘AI项目...苹果能否突破AI困境?

作者:小岩 编辑:彩云 2024年,伴随着AI技术的多次爆火,不仅各大科技巨头纷纷进入AI赛道展开角力,诸多智能手机厂商也纷纷加紧布局相关技术,推出众多AI手机。作为手机领域的龙头老大,苹果自然是…

Java中的ORM框架——myBatis

一、什么是ORM ORM 的全称是 Object Relational Mapping。Object代表应用程序中的对象,Relational表示的是关系型数据库,Mapping即是映射。结合起来就是在程序中的对象和关系型数据库之间建立映射关系,这样就可以用面向对象的方式&#xff0c…

写代码之前一定要提前想好思路

就和写数学题目一样,在做题目之前要先把思路确立下来。可能是我早年做数学的时候老是着急做题目没怎么分析过题目,把这个习惯不自觉地代入了代码的写入当中。习惯的养成使得我即使明白了自己的问题也依然会不断的犯错,看来只有刻意地提醒自己…

去除字符串中的空格和特殊字符

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 用户在输入数据时,可能会无意中输入多余的空格,或在一些情况下,字符串前后不允许出现空格和特殊字符,…

[双指针] --- 快乐数 盛最多水的容器

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 本篇博客我们分享一下双指针算法中的快慢指针以及对撞双指针,下面我们开始今天的学习吧~ 🏠 快乐数 📒 题…

windows系统电脑外插键盘驱动出现感叹号或者显示未知设备,键盘无法输入的解决办法

笔记本外插的键盘不能用,鼠标可以使用。 查找故障,结果打开设备管理器看到键盘那项里是一个的黄色惊叹号显示未知设备![图片]如下图所示 其实解决办法很简单,不要相信网上的一些博主说删除什么注册表,我开始跟着他们操…

蓝桥杯-AB路线(详细原创)

问题描述: 有一个由 N M 个方格组成的迷宫,每个方格写有一个字母 A 或者 B。小蓝站在迷宫左上角的方格,目标是走到右下角的方格。他每一步可以移动到上下左右相邻的方格去。 由于特殊的原因,小蓝的路线必须先走 K 个 A 格子、再…

Slurm集群使用基础

Introduction 我们在做生物信息分析时,对于大规模的上游数据的处理,一般需要在大型服务器或集群上进行。我最早接触并使用的是一个基于SLURM调度系统的集群,在此记录一下基础使用方法。 高性能计算集群(High-Performance Comput…

vs工程添加自定义宏

一、简介 用户可以添加自定义宏变量方便工程路径名称的修改和配置 例:$(SolutionDir) 为解决方案路径,$(PojectDir) 为工程所在路径 测试环境:vs2017,qt5.14.0 二、配置 1、打开属性窗口:视图-》其他窗口-》属性管…

使用Webcam实现摄像头的开启和关闭,并保存和复制图片

实现思路 0,将webcam的jar文件传入项目中 1,显示摄像头的地方:创建一个画板,在画板上添加开启和关闭按钮 2,设置开启和关闭功能:创建一个类实现动作监听器,进而实现监听动作按钮 3&#xff…

豪赌?远见?浙江东方的量子冒险

今年4月16日,量子通信概念异动,浙江东方(600120)拉升涨停。 量子和浙江东方,要把这两个词联系起来似乎并不太容易。 浙江东方,即浙江东方金融控股集团股份有限公司,系浙江省国资委下属浙江省国…

华发股份:加强业务协同 新政下项目热销

“5.17”楼市政策出台后,各地密集落地执行。5月27—28日,上海、广州、深圳三个一线城市跟进落地“517”新政。上海发布《关于优化本市房地产市场平稳健康发展政策措施的通知》,共计9条调整政策,涵盖外地户籍、人才、单身、婚否、企…

SpringBootWeb 篇-深入了解会话技术与会话跟踪三种技术(Cookie 会话跟踪、Session 会话跟踪与 JWT 令牌会话跟踪)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 会话技术 2.0 会话跟踪 2.1 会话跟踪 - Cookie 2.1.1 客户端获取 Cookie 的流程 2.1.2 Cookie 会话跟踪的特点 2.2 会话跟踪 - Session 2.2.1 客户端获取 SESSION…

【Linux 网络编程】网络的基础知识详解!

文章目录 1. 计算机网络背景2. 认识 "协议" 1. 计算机网络背景 网络互联: 多台计算机连接在一起, 完成数据共享; 🍎局域网(LAN----Local Area Network): 计算机数量更多了, 通过交换机和路由器连接。 🍎 广域网WAN: 将…

猫狗分类识别模型建立②模型建立

一、导入依赖库 pip install opencv-python pip install numpy pip install tensorflow pip install keras 二、模型建立 pip install opencv-python pip install numpy pip install tensorflow pip install kerasimport os import xml.etree.ElementTree as ETimpor…

Python Selenium 详解:实现高效的UI自动化测试

落日余辉,深情不及久伴。大家好,在当今软件开发的世界中,自动化测试已经成为保障软件质量和快速迭代的重要环节。而在自动化测试的领域中,UI自动化测试是不可或缺的一部分,它可以帮助测试团队快速验证用户界面的正确性…