vs2013 网站建设/广告软文小故事200字
结构体
结构体是一些值的集合,这些值称为成员变量,结构的成员可以是标量、数组、指针,甚至是其他结构体。
成员名可以与程序中其它变量同名,互不干扰。
结构体的定义
(struct+结构名+{})
struct books
{int a;char b;struct book* c;
};//分号不能少//
结构体成员不能在结构体内赋初值
关键字struct与结构名一起构成结构类型名
例
struct books是一个结构类型名
结构体可以嵌套定义
但结构体定义时***不允许***将成员的数据类型定义成自身的结构类型,这是因为结构类型的声明是构造阶段,系统还不知道需要分配多少内存空间。
但是结构类型中可以含有指向自身类型的指针变量。
结构变量
定义:
①在结构体定义时定义,此时变量位于结构体{}之后的;之前
②在结构体定义完后定义
③在匿名结构体定义时定义
由于此定义***省去了结构名***,在此定义语句后面无法再定义这个类型的其他结构变量,除非把定义过程再写一遍。
另外,以后如果再声明成员完全相同的结构类型,也和此次定义的结构类型属于不同的结构类型。
初始化:
对结构变量初始化时,需要按照其成员出现的顺序对每个成员依次赋值.
不能跳过前面的成员给后面的成员赋值
例如下面的用法是错误的:
struct books ps = { 1002, ,p};
运算:
相同类型的结构体变量可以进行整体赋值,但***不能***进行关系运算
传参:
①传值:要重新拷贝一份结构体变量,空间和时间的浪费比较大。
②传址:只需要传4/8个字节,速度更快。
所以结构体传参的时候最好使用传址调用
用typedef给结构体命名
结构体的类型名是 struct+结构名,如果觉得它太长了,可以在定义时/定义完成后用typedef给结构体重命名。
重命名方法:
①非匿名结构体重命名
②匿名结构体重命名
结构体重命名之后就可以像定义int 类型变量一样,定义结构变量了
也可以在定义后给结构体重命名(此时只能给非匿名结构体重命名,
给匿名结构体重命名会报错)
结构体的内存对齐(用干计算结构体的大小):
偏移量
是结构体变量的起始地址,向地址大的的增加量,如下图的柱形图的右侧的0.1.2.3.4.5.6.7.8.9等就是偏移量的值
结构体的对齐规则:
①第一个成员的首个字节在与结构体变量偏移量为0的地址处。
②其他成员变量要对齐到某个数字(对齐数)的整数倍的偏移量处。
对齐数=编译器默认对齐数与该成员自身字节中的***二者的较小值***。
(有默认对齐数的编译器很少,常用的只有VS有默认对齐数,其值为8)
默认对齐数也可以修改:
#pragma pack(数字)可以修改默认对齐数为括号中的数字
再次写#pragma pack()可以恢复成原默认对齐数
③结构体总大小为最大对齐数(每个成员变量都有一个对齐数,其中成员对齐数最大的成员的对齐数就是该结构体的最大对齐数)的整数倍。
④如果嵌套了结构体的情况,嵌套的结构体的第一个成员对齐嵌套结构体的最大偏移量的整数倍处
最外层结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
④如果成员是数组,则该成员的对齐数为它这个数组中元素类型的***字节数与编译器默认对齐数中较小的那一个。***
来算几个结构体的大小吧
①
struct books
{int a;char b;int c;
}sz;
a为第一个成员,所以它的第一个字节空间占据0偏移量,因为int类型占4个字节,所以还有3个字节的空间占据了1~3偏移量
因为除了第一个成员以外其他成员变量要对齐到其对齐数的整数倍的偏移量处
b的对齐数为1,因为4是1的倍数所以,char占据4偏移量处
c的对齐数为编译器默认对齐数与该成员自身字节中的二者的较小值,所以为4,
因为5~7不是4的整数倍,所以被舍弃,c的第一个字节空间占据第8个偏移量处,
剩下3个字节空间占据9~11偏移量。
该结构体的最大对齐数为4,0~11偏移量正好12个字节,因为12是4的整数倍,所以该结构体大小为12;
如图(啊,我图画的好丑):
②
struct books2
{char d;char e;double f;
};struct books1
{int a;char b;struct books2 c;
};
a的对齐数为4,占据0-3偏移量,
b的对齐数为1,占据4偏移量
因为***嵌套的结构体的第一个成员对齐嵌套结构体的最大偏移量的整数倍处***
所以·先计算struct bools2的最大对齐数,为f的对齐数,值为8;
所以5-7偏移量舍去,
d占据8偏移量
e占据9偏移量
10-15没有8的倍数,所以舍弃
所以f占据16-23偏移量
结构体struct books1 的最大偏移量为struct books2中的f为8,因为0-23偏移量的字节数为24,为8的整数倍,所以struct books1的大小为24个字节
位段:
位段的定义:
C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。
利用位段能够用较少的位数存储数据。
位段的特点:
①位段的成员可以是int ,unsigned int, signed int ,long(只要是整型就可以,浮点数不行)或者是char (属于整形家族)类型
②位段的 :后的值是 :前的位段成员所占的比特位(注意:位段中的变量所占比特位不能大于自身类型字节,例int类型的位段成员所占比特位不能超过32)
③位段的空间上是按照需要(根据类型)以4个字节(int) 或者1个字节( char )或者8个字节的方式来开辟的。不够用再按照需要(根据类型)以4个字节(int) 或者1个字节( char )开辟
例
struct books
{int _a:23;char _b:4;long _c: 22;
}A;
第一次遇到的类型为int所以开辟32个字节,这32个字节就可以囊括a,b了,因为c占22个字节而32-23-4=5<22,所以要再申请字节,因为遇到的是long所以再申请32个字节。
④位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
⑤位段只能存在于结构体中
位段中的截断
位段的变量赋值时
若位段的比特位小于赋值给位段的值的比特位时,会发生截断。
例:
struct books
{int _a:2;char _b:4;long _c: 2;
}A;
int main()
{A._c = 5;printf("%d \n", A._c);return 0;
}
_c的比特位为2,但是5的二进制位为101,所以去掉最高位1,存入了01,打印出来的就是1.
位段的跨平台问题:
1.类型为int位段成员(不写unsigned int/signed int)时被当成有符号数还是无符号数是不确定的。
2.位段中最大位的数目不能确定。(例如:long在Windows64位环境下占32个比特位,在Linux的64位环境下long却占64个比特位)
3.位段中的成员在内存中从左向右分配,还是从右向左分配(即存放数据时从左边的比特位开始存放,还是从右边的比特位开始存放)的c语言标准尚未定义。
4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时
例上面提到的:
struct books
{int _a:23;char _b:4;long _c: 22;
}A;
第一次遇到的类型为int所以开辟32个字节,这32个字节就可以囊括a,b了,因为c占22个字节而32-23-4=5<22,所以要再申请字节,因为遇到的是long所以再申请32个字节。
就有一个问题,32-23-4剩下的5个比特位是给c还是舍弃,这个问题的答案是不确定的[没有国际标准],所以不同平台可能不同。
位段总结:
跟结构体相比,位段可以达到同样的效果,是可以很好的节省空间,但是有跨平台的问题存在。
柔性数组:
定义:
或者
特点:
①柔性数组只能存在于结构体中,且必须是结构体的最后一个成员
②结构中的柔性数组成员前面必须至少一个其他成员。
③sizeof 返回的这种结构体大小不包括柔性数组的内存。
④包含柔性数组成员的结构体要用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小(即要给柔性数组前的成员动态内存分配)。
柔性数组的使用:
定义一个指针让其接受malloc的返回值,malloc的字节数为柔性数组前的成员的字节总数+给柔性数组的字节数
例
这样开辟的空间,也可以用realloc调整
有人就问了,为什么不能让struct books中的b设置成一个指针,然后让b动态内存申请呢?
其实是可以的,但是如果要保证***结构体中的所有成员都在堆区***,就要malloc两次
如下图:
柔性数组的好处
第一个好处是:方便内存释放
如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。
所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。
第二个好处是:这样有利于访问速度.
连续的内存有益于提高访问速度,也有益于减少内存碎片。(其实, 我个人觉得也没多高了,反正你还是要用做偏移量的加法来寻址)
总结
柔性数组知道的人少不是没道理的,因为它确实没多大用,就算知道柔性数组的人也很少用它,
以上就是全部内容了,如果对你有帮助就点个赞支持一下吧!
相关文章:

详解结构体(包含结构体内存对齐,柔性数组,位段)【尊嘟很详细】
结构体 结构体是一些值的集合,这些值称为成员变量,结构的成员可以是标量、数组、指针,甚至是其他结构体。 成员名可以与程序中其它变量同名,互不干扰。 结构体的定义 (struct结构名{}) struct books {int a;c…...

我的NPI项目之Android系统升级 - 同平台多产品的OTA
因为公司业务中涉及的面比较广泛,虽然都是提供移动终端PDA,但是使用的场景很多时候是不同的。例如,有提供给大型物流仓储的设备,对这样的设备必需具备扫码功能,键盘(戴手套操作),耐用…...

pnpm包管理器
官网 优点 快速 pnpm 比 npm 快了近 2 倍高效 node_modules 中的所有文件均克隆或硬链接自单一存储位置支持单体仓库 pnpm 内置了对单个源码仓库中包含多个软件包的支持权限严格 pnpm 创建的 node_modules 默认并非扁平结构,因此代码无法对任意软件包进行访问 安…...

flutter websocket发送ping包?
背景 服务端要求flutter客户端隔一段时间发送ping包,以此来建立心跳管理长连接。 代码 import package:web_socket_channel/io.dart; IOWebSocketChannel _channel IOWebSocketChannel.connect(Uri.parse(SocketService.url),pingInterval: const Duration(seco…...

基于采样的自动驾驶规划算法 - PRM,RRT,RRT*,CL-RRT
本文将讲解PRM,RRT,RRT*自动驾驶规划算法原理,不正之处望读者指正 0 前言 机器人运动规划的基本任务:从开始位置到目标位置的运动 (1)如何躲避构型空间出现的障碍物 (2)如何满足机器…...

CGAL的D维范围树和线段树
范围树和线段树是两种数据结构,用于高效地处理和查询数据。 范围树(Range Tree)是一种二叉树,它通过递归地将每个节点分割成两个子节点来存储一个点集。每个节点表示一个范围,并且存储该范围内所有点的最小和最大值。范…...

005.HCIA 传输层
传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP (Transmission Control Protocol)和用户数据包协议UDP (User Datagram Protocol)。 1、相关概念 a. 传输层的端口 端口范围:0-65535 知名端口:0-1023&…...

LLM之RAG实战(八)| 使用Neo4j和LlamaIndex实现多模态RAG
人工智能和大型语言模型领域正在迅速发展。一年前,没有人使用LLM来提高生产力。时至今日,很难想象我们大多数人或多或少都在使用LLM提供服务,从个人助手到文生图场景。由于大量的研究和兴趣,LLM每天都在变得越来越好、越来越聪明。…...

【SpringCloud笔记】(10)消息总线之Bus
Bus 前言 戳我了解Config 学习Config中我们遇到了一个问题: 当我们修改了GitHub上配置文件内容,微服务需要配置动态刷新并且需要手动向客户端发送post请求刷新微服务之后才能获取到GitHub修改过后的内容 假如有多个微服务客户端3355/3366/3377…等等…...

超酷的爬虫可视化界面
大家好,本文主要介绍使用tkinter获取本地文件夹、设置文本、创建按钮下拉框和对界面进行布局。 1.导入tkinter库 导入tkinter的库,可以使用ttkbootstrap美化生成的界面 ttkbootstrap官网地址:https://ttkbootstrap.readthedocs.io/en/late…...

【kafka消息里会有乱序消费的情况吗?如果有,是怎么解决的?】
文章目录 什么是消息乱序消费了?顺序生产,顺序存储,顺序消费如何解决乱序数据库乐观锁是怎么解决这个乱序问题吗 保证消息顺序消费两种方案固定分区方案乐观锁实现方案 前几天刷着视频看见评论区有大佬问了这个问题:你们的kafka消…...

【PID精讲12】基于MATLAB和Simulink的仿真教程
文章目录 写在前面一、基于Simulink的仿真1. 新建Simulink模型2. 保存Simulink模型3. 建模4. 运行二、基于MATLAB的仿真1. 编码2. 运行3. 调整曲线格式4. 导出图窗写在前面 第11讲介绍的连续系统的数字PID仿真是基于 Matlab的 M 语言实现的,对于初学者或者工程应用人员来说,…...

手机无人直播:解放直播的新方式
现如今,随着科技的迅猛发展,手机已经成为我们生活中不可或缺的一部分。除了通讯、娱乐等功能外,手机还能够通过直播功能将我们的生活实时分享给他人。而针对传统的直播方式,使用手机进行无人直播成为了一种全新的选择。 手机无人…...

ios 之 数据库、地理位置、应用内跳转、推送、制作静态库、CoreData
第一节:数据库 常见的API SQLite提供了一系列的API函数,用于执行各种数据库相关的操作。以下是一些常用的SQLite API函数及其简要说明:1. sqlite3_initialize:- 初始化SQLite库。通常在开始使用SQLite之前调用,但如果没有调用&a…...

Django(三)
1.快速上手 确保app已注册 【settings.py】 编写URL和视图函数对应关系 【urls.py】 编写视图函数 【views.py】 启动django项目 命令行启动python manage.py runserverPycharm启动 1.1 再写一个页面 2. templates模板 2.1 静态文件 2.1.1 static目录 2.1.2 引用静态…...

vscode括号颜色突然变成白色的了,怎么解决
更新版本后发现vscode的各种括号都变成了白色,由于分色括号已经使用习惯,突然变成白色非常不舒服,尝试多次后,为大家提供一下几种解决方式,希望能帮到同样受到此种困惑的你: 第一种: 首先打开…...

测试服务器带宽(ubuntu)
apt install python3 python3-pippip3 install speedtest-clispeestest-cli...

【WPF】使用Behavior以及ValidationRule实现表单校验
文章目录 使用ValidationRule实现检测用户输入EmptyValidationRule 非空校验TextBox设置非空校验TextBox设置非空校验并显示校验提示 结语 使用ValidationRule实现检测用户输入 EmptyValidationRule是TextBox内容是否为空校验,TextBox的Binding属性设置ValidationRu…...

ArcGIS渔网的多种用法
在ArcGIS中有一个渔网工具,顾名思义,可以用来创建包含由矩形像元所组成网络的要素类。不太起眼,但它的用途却有很多,今天跟大家分享一篇关于渔网的多种用途。 1.马赛克地图制作 2.基于网格的设施密度统计制作马赛克地图 准备材…...

C++ 中使用 std::map 的一个示例
std::map 是一个容器,可以用来存储键值对,其中键是唯一的,每个键都映射到一个值 #include <iostream> #include <map>int main() {// 声明了一个 std::map<std::string, int> 类型的变量 myMap,它可以将字符串…...

python虚拟环境及其在项目实践中的应用
文章目录 1.问题的提出1.什么是python虚拟环境2.如何创建2.1第1步-为共享同一虚拟环境的项目创建共同的父目录2.2第2步-在父目录下创建虚拟python环境2.3在父目录下创建各个项目文件夹 1.问题的提出 假设我正在开发若干python项目,这里假定项目名分别为Project1&am…...

普中STM32-PZ6806L开发板(烧录方式)
前言 有两种方式, 串口烧录和STLink方式烧录;串口烧录 步骤 开发板USB转串口CH340驱动板接线到USB连接PC使用自带工具普中自动下载软件.exe烧录程序到开发板 ST Link方式 这种方式需要另外进行供电, 我买的如下,当年用于调试STM8的,也可…...

基于单片机设计的指纹锁(读取、录入、验证指纹)
一、前言 指纹识别技术是一种常见的生物识别技术,利用每个人指纹的唯一性进行身份认证。相比于传统的密码锁或者钥匙锁,指纹锁具有更高的安全性和便利性,以及防止钥匙丢失或密码泄露的优势。 基于单片机设计的指纹锁项目是利用STC89C52作为…...

HarmonyOS - 基础组件绘制
文章目录 所有组件开发 tipsBlankTextImageTextInputButtonLoadingProgress 本文改编自:<HarmonyOS第一课>从简单的页面开始 https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101667360160710997 所有组件 在 macOS 上,组…...

AR智慧校园三维主电子沙盘系统研究及应用
一 、概述 易图讯科技(www.3dgis.top)自主研发的智慧校园三维主电子沙盘系统,采用B/S架构模式,采用自主可控高性能WebGIS可视化引擎,支持多用户客户端通过网络请求访问服务器地图和专题数据,提供地理信息数据、专题数据的并发访问…...

web前端项目-七彩夜空烟花【附源码】
web前端项目-七彩动态夜空烟花【附源码】 本项目仅使用了HTML,代码简单,实现效果绚丽,且本项目代码直接运行即可实现,无需图片素材,接下来让我们一起实现一场美丽的烟花秀叭 运行效果:鼠标点击和移动可控制…...

在k8s中将gitlab-runner的运行pod调度到指定节点
本篇和前面的 基于helm的方式在k8s集群中部署gitlab 具有很强的关联性,因此如果有不明白的地方可以查看往期分享: 基于helm的方式在k8s集群中部署gitlab - 部署基于helm的方式在k8s集群中部署gitlab - 备份恢复基于helm的方式在k8s集群中部署gitlab - 升…...

1.解决父组件传数据给子组件太慢,导致子组件获取不到合适数据渲染出错问题2.vue中props传递异步数据,子组件用watch监听
vue中props传递异步数据,子组件用watch监听...

SpringMVC之获取请求参数和域对象共享数据
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…...

IntelliJ IDEA Community(社区版)下载及安装自用版
IntelliJ IDEA Community(社区版)下载及安装自用版 估计是个开发都逃脱不了用IDEA的命运吧,这么好的软件,白嫖了好多年。感恩。 现在很多公司已经不让用商业版的破解版了,所以这里讲的是社区版。 区别: 商…...