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

news/2024/10/18 3:27:44/

结构相关知识总结

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

什么是结构?

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

结构的声明与简单使用

结构的声明并没有创建出实际的数据对象,只是描述了该对象是由什么组成的而已。下图中创建一个结构,结构的标识为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都适用。
指针的缺点:无法保护数据。被调函数中的某些操作可能会意外影响原来结构中的数据。
结构的优点:数据受到保护,因为函数处理的是原本数据的副本,而且代码风格也比较清晰。
结构的缺点:相较于指针而言,执行缓慢一些。


http://www.ppmy.cn/news/386804.html

相关文章

轻量云服务器远程连接不了怎么办?

​  轻量云服务器为轻量级云计算服务,其可满足低需求、轻体验的个人和企业用户。但是,有时候我们会遇到轻量云服务器远程连接不了的问题,这对于需要远程管理服务器的用户来说是非常困扰的。本文展示了轻量云服务器无法正常远程连接的一些排…

小笔记:Electron中关联格式、处理文件、创建链接的相关编程

Electron 笔记:Electron中关联格式、处理文件、创建链接的相关编程 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 :291148484163.com 本文地址:http…

100天精通Golang(基础入门篇)——第8天:Go语言程序的流程结构和条件语句

🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《I…

两万字深入浅出yolov5+deepsort实现目标跟踪,含完整代码, yolov,卡尔曼滤波估计,ReID目标重识别,匈牙利匹配KM算法匹配

目录 一:前言 二:跟踪部分: ReID结构​编辑 第一帧(生成track) 第二帧 更新先验的预测值 状态矩阵的初始化 对预测值进行更新(矫正): 匹配完成,进行矫正的更新&…

关于Nokia6630 Alert出现乱码问题

http://www.3geye.net/bbs/thread-179-1-1.html 大家在 开发软件的时候经常要用到高级的AlertUI,我也用在其他机器上可以正确的显示文字,在Nokia 6630 上却显示几个口字,全部是乱码,除非中,请文大家有没有遇到这样的问…

Nokia N-GAGE QD 新人菜鸟教程

QD的必备硬件1:MMC卡(建议使用128M 256M)2:读卡器(QD没有USB插口,读卡器是连接MMC卡最常用的方法,这样就可以把电影,游戏,MP3,其他虾米软件都可以放上MMC里了…

塞班为什么那时候只有java_回忆S60(塞班)年代的JAVA游戏

那时候的手机内存很小,要用来玩游戏的话就必须买一个大内存的MMC卡,手机也没那么多款式,班上同学几乎用着同样的几款手机,系统还都是 S60 。 S60 系统的游戏有三大类,分别是 N-Gage 、 SIS 、 JAVA ,这顺序恰好也是游戏可玩性的排序,都说 JAVA 游戏最为简单,可玩性一般…

java添加两个音乐_[JavaME]手机同时播放两个音乐 探讨一

[JavaME]手机同时播放两个音乐 探讨一 摘要: 本文档以及后续文档试图一步一步地探讨如何在手机上同时播放两个声音文件,譬如一个是背景音乐,一个是按键触发的游戏音效。请慢慢看下去,我们尽量糅合进各方汇集的一些经验。 1背景 摘…