C语言复合类型之结构(struct)篇(结构指针)

结构相关知识总结

  • 什么是结构?
  • 结构的声明与简单使用
  • 结构的初始化
  • 结构中成员变量的访问
  • 结构的初始化器
  • 结构数组
      • 结构数组的声明
      • 结构数组的成员标识
  • 结构的嵌套
  • 结构指针
  • 结构作为参数在函数中传递
      • 将结构成员作为参数进行传递
      • 将结构地址(指向结构的指针)作为参数进行传递
      • 将整个结构作为参数进行传递
  • 结构和结构指针的选择

什么是结构?

结构是一种复合类型,一个结构里面存放多种数据类型的元素,相比数组而言,简直爽歪歪不是。它既可以包含不同的数据形式,又可以使得个信息之间保持独立。
此部分非常之重要,不可马虎呀

结构的声明与简单使用

结构的声明并没有创建出实际的数据对象,只是描述了该对象是由什么组成的而已。下图中创建一个结构,结构的标识为book,结构变量为:library
请添加图片描述

上图中,对于结构的创建的结构变量的声明可以合二为一,声明方法与使用方法如下图所示,而且组合之后的使用可以不要结构标记(即下图中的book可以去掉)。如果该结构模板是要多次被使用的,则需要使用结构标识
请添加图片描述

结构的初始化

结构的初始化与数组的初始化别无二致,都是同样的手法。使用花括号将初始化列表括起来进行初始化,各个初始化项之间使用逗号隔开,为了代码的可读性,一行只写一个初始化项。使用初始化时必须要带上结构标识,不能只有结构变量与struct关键词
请添加图片描述

结构中成员变量的访问

使用结构成员运算符——点(.)访问结构中的成员,例如上面的library.uesrIDlibrary.message。值得注意的点是:library是一个结构,但是library.uesrID却相当于是一个int类型的变量,可以像使用其他int类型变量的情况去使用它。
例如:scanf("%d",...)需要一个int类型的值,而library.uesrID正符合要求的话,那么就可以这么写:scanf("%d",&library.uesrID),&比 . 的优先级高

结构的初始化器

C99和C11对结构提供了指定初始化器,使用点运算符和成员名标识特定的元素,这也初始化结构的一种手段。如下图所示,可以按照任意顺序给初始化项进行赋值。
请添加图片描述

结构数组

结构数组的声明

结构数组的声明和其他类型数组的声明类似
struct book library[MAXBKS];library声明成一个具有MAXBKS个元素的数组,数组的每个元素都是一个book类型的结构变量。library[0]是第一个book类型的结构变量,library[1]是第二个book类型的结构变量,以此类推。结构数组示意图如下:

请添加图片描述

结构数组的成员标识

library[0].userID:表示第一个数组元素与userID相关联
library[4].mssage:表示第五个数组元素与message相关联
请添加图片描述

结构的嵌套

嵌套结构即在结构中包含中另一个结构,使用如下图所示,将结构数组与嵌套结构结合在了一起。
请添加图片描述

结构指针

使用结构指针的优点:指向结构的指针通常比结构本身更容易操控;结构作为参数传递的时候传递指针更有效率
和数组不同的是,数组名是数组的地址或者说是数组首元素的地址,即有arr = &arr[0],但结构名不是结构的地址。
请添加图片描述

struct guy * him;声明了一个指向struct guy结构的指针him.上图中那个fellow是一个结构数组,也就是说fellow[0]是一个结构变量,要让him指向fellow[0],可以写为:him = &fellow[0],him + 1 = &fellow[1]

him是一个指针(struct guy类型的),是fellow[0]所在的地址,所以如果想要通过指针拿到fellow[0].income的值,写法为:*him,因为*him = fellow[0](因为him = &fellow[0])*& 可以相互抵掉。

fellow[0].income == (*him).income

fellow[0].handle.first = (*him).handle.first
fellow[1].handle.first = (*(him + 1)).handle.first

->运算符

him = &fellow[0]
那么:him->income 也就是fellow[0].income

总之,如果him是指向guy类型的结构barney的指针,下列的关系恒成立。
barney.income == (*him).income == him ->income

再加一个结构指针的例子⑧。需要注意的是声明指针之后需要指向结构变量,这样才能生效。(*him).first == him ->first
请添加图片描述

结构作为参数在函数中传递

结构作为参数在函数中传递的时候既可以传递结构本身,也可以传递指向结构的指针,还可以传递结构中的成员,但前提是改成员为具有单个之的数据类型,即int、char、指针等。

将结构成员作为参数进行传递

函数并不关心被传入的参数是否为结构的成员,她只关注被传入参数是否符合相关要求的数据类型即可。
请添加图片描述

将结构地址(指向结构的指针)作为参数进行传递

请添加图片描述

sum函数的形参列表要求传入的就是一个指针,函数在被调用的时候也传入了&DDD,使用&来获取结构的地址,和数组名不同,结构名只是其地址的别名。

将整个结构作为参数进行传递

此方法只适用于允许将结构作为参数的编译器,就是将【将结构地址(指向结构的指针)作为参数进行传递】中的指针换成结构就可以啦,而且几乎用的很少,所以就不再赘述啦。

结构和结构指针的选择

在设计与结构相关的函数时,选择结构或者结构指针作为参数都可以,两者各有优缺点:

指针的优点:执行起来比较快,因为只需要一个地址,而且不管是以前的C还是现在的C都适用。
指针的缺点:无法保护数据。被调函数中的某些操作可能会意外影响原来结构中的数据。
结构的优点:数据受到保护,因为函数处理的是原本数据的副本,而且代码风格也比较清晰。
结构的缺点:相较于指针而言,执行缓慢一些。

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

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

相关文章

C语言进阶--指针(C语言灵魂)

目录 1.字符指针 2.指针数组 3.数组指针 4.数组参数与指针参数 4.1.一维数组传参 4.2.二维数组传参 4.3.一级指针传参 4.4.二级指针传参 5.函数指针 6.函数指针数组 7.指向函数指针数组的指针 8.回调函数 qsort函数 9.指针和数组笔试题 10.指针笔试题 前期要点回…

Linux学习[16]bash学习深入2---别名设置alias---history指令---环境配置相关

文章目录 前言1. alias2. history3. 环境配置相关总结 前言 linux学习15里面简单提了一下alias指令,就表明它是一个别名的作用,这节就展开来写一下。 同时上一节一笔带过的history指令,这一节也进行例子的演示记录。 最后是环境相关的配置&a…

常用API(String,ArrayList)

1:String类概述 String是字符串类型,可以定义字符串变量指向字符串对象String是不可变字符串的原因?1.String变量每次的修改都是产生并指向新的字符串对象。2.原来的字符串对象都是没有改变的,所以称不可变字符串。 2:String创建…

八股文总结

文章目录 项目介绍1.不动产项目项目难点机器学习算法调研图像提取算法调研数据集-ImageNetXceptionVGGInceptionDensenetMobilenet 系统流程图 2.图书项目技术栈ShiroMybatisMyBatis:Mybatis Plus: 面试问题 Java基础基本数据类型反射接口和抽象类异常代理模式1. 静态代理2. 动…

『DevOps最佳实践』使用Jenkins和Harbor进行持续集成和交付的解决方案

📣读完这篇文章里你能收获到 全文采用图文形式讲解学会使用Harbor配置项目学会在Jenkins中配置Harbor推送权限使用Jenkins和Harbor进行持续集成的实践感谢点赞收藏,避免下次找不到~ 文章目录 一、准备工作1. 环境准备2. 修改Docker配置文件3. Docker登陆…

【SpringCloud】三、Nacos服务注册+配置管理+集群搭建

文章目录 一、认识Nacos1、安装2、服务注册和发现3、服务分级存储模型4、负载均衡策略--NacosRule5、服务实例的权重设置5、环境隔离namespace6、Eureka和Nacos的区别 二、Nacos配置管理1、统一配置管理2、微服务配置拉取3、配置热更新4、多环境配置共享 三、Nacos集群搭建1、初…

架构-嵌入式模块

章节架构 约三分,主要为选择题 #mermaid-svg-z6RGCDSEQT5AhE1p {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-z6RGCDSEQT5AhE1p .error-icon{fill:#552222;}#mermaid-svg-z6RGCDSEQT5AhE1p .error-text…

Apifox(1)比postman更优秀的接口自动化测试平台

Apifox介绍 Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台,定位 Postman Swagger Mock JMeter。通过一套系统、一份数据,解决多个系统之间的数据同步问题。只要定义好 API 文档,API 调试、API 数据 Mock、API 自…

利用腾讯云函数隐藏C2服务器

1、简介 腾讯云函数,可以为企业和开发者提供无服务器执行环境,无需购买和管理服务器,只需要在腾讯云上使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性 安全地运行代码。 C2服务器所有流量通过腾…

AB32VG1:SDK_AB53XX_V061(4)蓝牙音频测试笔记

文章目录 1. 淘宝上两种开发板,有一种的蓝牙功能不正常2. 蓝牙音频测试2.1 《config.h》和《Boombox.setting》两个配置以哪个为准2.2 codeblocks更换链接库2.2.1 这样进入build options是错的2.2.2 build options正确打开方式 2.3.编译工程,下载运行2.3…

手撕学生管理系统超详解——【c++】

题目要求:设计一个学生成绩管理程序,实现按班级完成对学生成绩信息的录入和修改,并用文件保存。 实现按班级输出学生的成绩单;实现按学号和姓名进行查询,按平均成绩进行排序功能。 问题描述 该程序的目标是提供一个简单且易于使用…

Linux本地搭建GitLab服务器 - 内网穿透远程访问

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar内网穿透5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 转载自cpolar极点云文章:Linux搭建GitLab私有仓库,并内网穿透实…

为什么我们需要API接口?API接口的核心又是什么?

API(Application Programming Interface)是一种连接不同软件之间的标准化的接口,可以让不同软件间进行数据交互和通信。API接口的作用很多,以下是几个主要的原因: 1.提高软件系统的灵活性和可扩展性。API接口可以将不…

Banana Pi BPI-R3 Mini:2.5GbE 嵌入式路由器板,MTK7986方案

香蕉派 BPI-R3 Mini Banana Pi BPI-R3 Mini 是一款功能强大的 SBC 路由器板,专为需要高速网络功能的个人和企业而设计。这款路由器是广受欢迎的 Banana Pi R3 路由器板的小兄弟,配备了先进的功能,旨在提供可靠的性能,是需要可靠网…

2.MATLAB篇——基本操作与矩阵输入

>> cos(((12345)^5)^0.5)ans -0.3623>> help sinsin - 参数的正弦,以弧度为单位此 MATLAB 函数 返回 X 的元素的正弦。sin 函数按元素处理数组。该函数同时接受实数和复数输入。 对于 X 的实数值,sin(X) 返回区间 [-1, 1] 内的实数值。 对于…

离散数学题目收集整理练习(期末过关进度50%)

✨博主:命运之光 🦄专栏:离散数学考前复习(知识点题) 🍓专栏:概率论期末速成(一套卷) 🐳专栏:数字电路考前复习 ✨博主的其他文章:点击…

flutter DevTools(1)

在VSCODE中调试 第一步: ① 切换到 vscode 的调试和运行模式, ② 配置好 .vscode 中的启动项 launch.json ③ 共有四种模式 [1] debug : 模式编译产物适合纯 Flutter 侧代码的开发、调试 [2] profile : 的用来做性能分析和测试 [3] release : 的用于打包发布 [4]…

【C++】C++11新特性重点:可变参数+lambda

C11新特性第二篇重点 文章目录 上一篇的补充一、可变参数模板二、lambda函数总结 前言 上一篇我们重点讲解了右值引用移动语义,关于移动构造和移动赋值还有一些需要补充的知识: 如果你没有自己实现移动构造函数,且没有实现析构函数 、拷贝构…

RabbitMq消息堆积问题及惰性队列

消息堆积问题 当生产者发送消息的速度超过了消费者处理的速度,就会导致队列的消息堆积,知道队列存储消息达到上限。最早接受的消息,可能就会成为死信,会被丢弃,这就是消息堆积问题。 解决消费对接问题 1.增加更多的消…

【数据库一】MySQL数据库初体验

MySQL数据库初体验 1.数据库基本概念1.1 数据Data1.2 表1.3 数据库1.4 数据库管理系统1.5 数据库系统 2.数据库的发展3.主流的数据库介绍3.1 SQL Server(微软公司产品)3.2 Oracle (甲骨文公司产品)3.3 DB2(IBM公司产品…