若是阁下满意的话,能否一键三连呢!!!!
结构体基础知识:
概念:结构体是一些值的集合,这些值称为变量,变量可以是不同类型
这里我们再想一下之前的数组,数组是一类相同元素的集合,而结构体可以想象成一个系统,这个系统由许多配件共同发挥作用 ,这么说理解了吧
结构的声明
结构有一个固定的声明,类型(格式)如下:(其中Arr是自定义的,相当于名字)
我们来看一个错误例子,记住这是错误的啊!
解析:(我们这里先看错误,在初始化里面有正确案例参考)
什么时候判断结构体是否需要数组类型?就比如“int age”,“char name【】”
1:比如名字,是由一个个字符组成,那么char是一个字节,存不下,那么肯定就需要数组来装
2:再比如年龄,年龄是整数4个字节,int刚好4个字节,就不需要再创建数组
3:同理,体重也是如此,float是浮点数类型,只装一个小数而已,也不用担心装不下
下面的那个“p” 是自定义的一个名字(可以理解为名字,就像1,2,3这些,给它取一个名字)
结构体变量的初始化
初始化其实和上面那副图差不多,就是给变量一个值,来初始化,可以理解为
int a = 10;
我们再来看一个例子,主要是打印,加深理解
解析:
打印时,需要打印的类型与结构体中的变量对应,后面的“p.name”可以理解为“p里面的name”
这样好记一些
结构体的嵌套使用
理解:
嵌套使用就是像函数嵌套那样,结构体里面套结构体,理解很简单
我们看个例子
解析:
我们先看1处:
结构体里面嵌套结构体,就不需要重新去给它命名了,直接对应每个变量,在遇到嵌套时,加一个“{}”就表示进入这个结构体了,再对应输入就行了,参考上面例子理解
看2处:
比如“pc.p.high”,打印嵌套结构体可以理解为“pc里面的p的high”,注意是pc,p自己命名的名字啊
看3处:
嵌套结构体只需要再给它个声明和名字和编号就行了
结构体的函数调用
理解:就是把结构体调用到函数里面
我们看一个例子
解析:
这是一种调用方式(接下来我会介绍第二种,因为这种并不好),进行传值调用,需要注意的是,在接受的时候需要用结构体接收,因为你调过去的是一个结构体
我们看第二种方法
解析:
两种打印方式都是进行传址调用,那么在接收的时候需要用结构体指针接收,
我们仔细讲明“struct Ps *p1”,前面的struct作为标志表示它是结构体类型,后面的“Ps”表示传过去的结构体Ps,“*”表示它是结构体指针类型,p1就是用来接收的(一个自定义名字)
我们看打印方式1:
*p1接收的是pc,所以(*p1).age可以理解为pc.age,只不过是把pc换了个名字成*p1
我们看打印方式2:
->就是指向的意思,其它没什么变化,只需要理解这个符号就行了
为什么第二种打印方式更好?(第一种只需要了解就可,知道有这种传参方式)
函数传参需要压栈,如果传递一个结构体对象时,结构体过大,压栈的开销太大,从而导致性能下降