学习结构体
先来看一个实际的问题话说有一个项目上有4个传感器,温度,湿度,水位,光照强度,然后呢各个传感器还有设置报警的阈值范围
一般都是这样写
https://ask.qcloudimg.com/http-save/yehe-1631029/xq1jpbh2uh.png
然后项目上还需要记录其它变量
https://ask.qcloudimg.com/http-save/yehe-1631029/9r8zuv1f9t.png
然后过了几天又增加了个PH值的传感器
https://ask.qcloudimg.com/http-save/yehe-1631029/2zenarzbha.png
然后过了几天,每个传感器还需要加个是不是正常工作的标志
https://ask.qcloudimg.com/http-save/yehe-1631029/kbywe6940v.png
然后又增加了5个传感器 温度,湿度,水位,光照强度,PH
https://ask.qcloudimg.com/http-save/yehe-1631029/l56qxqnow8.png
然后又增加了5个传感器 温度,湿度,水位,光照强度,PH
截图截不开了....
https://ask.qcloudimg.com/http-save/yehe-1631029/dfp6w81fg6.png
满屏的变量......
满屏的变量......
满屏的变量......
在项目刚开始做的时候如果不能未雨绸缪.接着干下去整个程序代码别说维护了
就是接着写都让人头疼!!!满屏的变量...
然后搞C语言那帮家伙就造了个功能 struct1.结构体就是可以把变量包含到里面的东西.
struct 就代表要定义一个结构体
sensors 是这个结构体的名字
然后是一个大括号 {}
大括号里面就随意定义变量啦,我是按照前面说的需求定义的
https://ask.qcloudimg.com/http-save/yehe-1631029/tl7gvzub39.png
怎么使用里面的变量呢?
注意结构体是一个数据类型!!!!就像是int char 一样的这种类型
既然是一种数据类型,那么就可以用这个数据类型定义变量
定义一个该结构体的变量
https://ask.qcloudimg.com/http-save/yehe-1631029/68390hf671.png
不要问我为啥要那样子定义,你去问造C语言的那帮家伙去!!!!问问他们为啥要设计成这样子!!!
然后操作结构体变量里面的成员变量
https://ask.qcloudimg.com/http-save/yehe-1631029/ae7h7m3q3z.png
https://ask.qcloudimg.com/http-save/yehe-1631029/j6hj22s4go.png
有人会问为啥是 结构体变量 中间加个点 ???
你去问造C语言的那帮家伙去!!!!问问他们为啥要设计成这样子!!!
2.其实定义结构体变量可以下面这样子
https://ask.qcloudimg.com/http-save/yehe-1631029/424uutfzmm.png
也可以定义多个
https://ask.qcloudimg.com/http-save/yehe-1631029/zkrrf6yq3x.png
https://ask.qcloudimg.com/http-save/yehe-1631029/xdoqvu9awg.png
发现了没,每个结构体变量都是单独拥有结构体里面的全部成员变量.
就像是最一开始说的,如果再增加一套 温度,湿度,光照,水位传感器,
使用结构体的话只需要再定义一个结构体变量即可.
先补充下 typedeftypedef 是可以把一个数据类型取一个别的名字
typedef {数据类型}{别的名字}
https://ask.qcloudimg.com/http-save/yehe-1631029/pk7buqnkrt.png
注意下:1.下面的代表了这个结构体数据类型
https://ask.qcloudimg.com/http-save/yehe-1631029/0m6bhj7957.png
2.给这个数据类型起一个别名
注意是三部分哈,typedef{数据类型}{别的名字}
所以sensor 就代表了这个结构体了
https://ask.qcloudimg.com/http-save/yehe-1631029/frjb2k75s4.png
3.以后定义结构体变量的时候
https://ask.qcloudimg.com/http-save/yehe-1631029/4ock0z06mo.png
4.然后呢结构体名字可以省略
https://ask.qcloudimg.com/http-save/yehe-1631029/i98xwcamdx.png
结构体变量可以放任何变量(列如 int型指针)https://ask.qcloudimg.com/http-save/yehe-1631029/dj0ivepmt0.png
https://ask.qcloudimg.com/http-save/yehe-1631029/mkj8nhvmg5.png
结构体变量可以放任何变量(列如 函数指针)https://ask.qcloudimg.com/http-save/yehe-1631029/4hf490kvsl.png
https://ask.qcloudimg.com/http-save/yehe-1631029/oy4v4qvksx.png
结构体变量可以放任何变量(列如 结构体变量)https://ask.qcloudimg.com/http-save/yehe-1631029/r4s9uileca.png
https://ask.qcloudimg.com/http-save/yehe-1631029/8gukoiii8f.png
然后是结构体指针1.结构体是一个数据类型,数据类型当然也可以定义对应的指针变量啦.
就像是int 类型可以定义 int *add; 一样
https://ask.qcloudimg.com/http-save/yehe-1631029/fppacpaivn.png
https://ask.qcloudimg.com/http-save/yehe-1631029/qvluzdoung.png
结构体是C语言中一种用户自定义的数据类型,可以将不同类型的数据组合在一起进行管理和操作。 编译器可能会根据数据类型对结构体成员进行对齐,以提高内存访问效率。 它由多个成员组成,每个成员可以是不同的数据类型,如基本数据类型、数组、指针等,甚至可以是其他结构体(即嵌套结构体)。 可以在定义结构体变量的时候进行初始化,也可以在后面的使用过程中通过赋值语句进行初始化。
如果部分成员未初始化,对于数值型数据,编译器会自动将其初始化为0;对于字符型数据,会自动初始化为'\0'。 为了避免复制结构体带来的开销,并且能够在函数内部修改原始结构体,可以使用传址调用,即传递结构体的指针。 可以使用赋值运算符=将一个结构体变量的值复制给另一个结构体变量。 使用printf等函数逐个打印结构体成员的值。 访问结构体数组中的元素和访问普通数组元素类似,通过下标运算符来进行访问,然后使用点运算符来访问结构体成员。 使用struct关键字定义结构体类型,并为其成员指定数据类型。 结构体可以包含指向自身的指针,用于实现链表、树等数据结构。 使用 memcpy 复制结构体时需确保内存连续且无动态成员。 结构体可以作为参数传递给函数,但传递的是副本,不会影响原结构体。
如果需要修改原结构体,可以传递结构体指针。 结构体变量之间不能直接使用==或!=进行比较,需要逐个成员比较。 如果结构体包含指针成员,需要特别注意深拷贝和浅拷贝的问题,避免悬空指针和内存泄漏。 可以按照结构体成员的定义顺序进行初始化。 结构体定义完成后,可使用该类型声明变量。声明方式有两种,一种是先定义结构体类型,再声明变量;另一种是在定义结构体类型的同时声明变量。 编译器会自动对齐成员以提升访问效率,可能导致结构体大小大于成员总和。 结构体成员在内存中的存储要遵循内存对齐规则。内存对齐的目的是为了提高内存访问的效率,但可能会导致结构体占用的内存空间大于所有成员实际占用的空间之和。 要熟悉结构体定义的基本格式,使用struct关键字来定义结构体类型,之后紧跟结构体名和包含的成员列表