结构体类型的声明
结构体的声明
结构的基础知识:
- 结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。
现实生活中有很多的对象是复杂的,我们无法用简单的int类型、double类型、又或者是float类型来将其描述出来。这个时候我们就需要结构体了。
结构的声明
struct tag //struct是结构体关键字,tag是结构体标签(可随意替换) { member-list; //成员列表 }variable-list; //变量列表
倘若我们像描述一个人,人当然是一个非常复杂的对象了,所以我们来创造一个结构体来将其进行描述(比如名字、年龄、电话、性别):
下面我们换一种写法:
注意不要将这两个东西弄混:
第一张图中的Stu是一个类型,而第二张图中的s1,s2,s3是利用结构体类型直接创建的变量。
结构成员的类型
结构体的成员可以是标量、数组、指针、甚至是其它的结构体。
结构体初始化、结构成员访问以及结构体传参
我们有了结构体变量,那如何定义变量呢?请看:
下面看一个复杂点的:
倘若我们利用一个函数(结构体传参)来打印结构体,请看:
利用函数(结构体指针传参):
那么函数print1()和函数print2哪一种好呢?答案是函数print2(),为什么呢?请跟着我的思路来:
当我们创建结构体变量s时肯定是需要在内存中开辟一块空间的,这里结构体变量s是个实参,s这个对象当进行传参时,倘若采用函数print1()的方式,由于tmp是形参,当实参传给形参时,形参是实参的一份临时拷贝,此时我们必须再次拷贝出一份和它一模一样大小的数据放在内存中其它的位置叫tmp,此时内存中就有了两块内存空间,一块是实参s的空间,另一块就是形参tmp的空间。这样不仅仅是空间浪费严重,而且当我们把s里面的数据全部拷贝到tmp中去时,时间浪费也特别严重。
而当我们采用函数print2()的方式时,ps是一个指针,故此时传过去的是一个地址。而一个地址无非是4或8个字节,无论这个结构体多大,我只传4或者8个字节,这样传参过去之后只需要创建一个结构体指针变量ps就行,再通过这个指针进行相关数据的打印即可。
所以说啊,首选函数print2()的原因:函数传参的时候,参数也是需要压栈的,如果传递一个结构体对象的时候,结构体过大,函数压栈的系统开销比较大,所以会导致性能的下降。
结论:在未来,如果允许的情况下,进行结构体传参时要传结构体的地址。