目录
一、结构体的声明
⛳1.结构的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量
⛳2.结构体的声明
struct stu
{
//成员变量
char name[20];//名字
int age;//年龄
char id[20];//学号
};
int main()
{
struct stu s;//对象
return 0;
}
struct stu是一种自定义类型
s是一个用struct stu创建的对象
char name[20]; int age; char id[20]; 是结构体的成员
⛳3.结构成员的类型
结构的成员可以是标量,数组,指针,甚至是其他结构体。
struct stu
{
//成员变量
char name[20];//名字
int age;//年龄
char id[20];//学号
};s1,s2//s1和s2也是结构体变量
//s1,s2是全局变量
int main()
{
//s是局部变量
struct stu s;//对象
return 0;
}
struct B
{
char c;
short s;
double d;
};
struct stu
{
//成员变量
struct B sb;
char name[20];//名字
int age;//年龄
char id[20];//学号
};s1,s2//s1和s2也是结构体变量
//s1,s2是全局变量
int main()
{
//s是局部变量
struct stu s;//对象
return 0;
}
⚠️
注意:结构体的成员可以是另一个结构体
二、结构体定义和初始化
⛳1.结构体定义
详解:
用类型创建了一个对象出来,就相当于盖房子,在设计出图纸后,用图纸盖出房子。图纸就相当于类型,而房子就相当于对象。
当用struct创建一个对象的时候就可以把它看成是盖了一个房子,而这个房子要有客厅、卧室、厨房。那么相当于在创建出来的对象里要有一块空间来存放它的相关属性。
⛳2.结构体初始化
在结构体定义的时候给它一个值就叫做初始化
⚠️
注意:结构体的初始化要使用{ }
三、结构体成员的访问
结构体变量访问成员,结构变量的成员是通过点操作符(.)访问的。点操作符接收两个操作数
⛳ 1.点操作符(.)
⛳ 2.箭头操作符 (->)
⚠️
注意:箭头操作符是用在结构体指针里面的
如果大家对指针有疑问,可以去看我关于指针的文章,下面是链接卡片。
四、结构体传参
⛳1.写一个函数来打印结构体的内容
#include<stdio.h>
struct B
{
char c;
short s;
double d;
};
struct stu
{
//成员变量
struct B sb;
char name[20];//名字
int age;//年龄
char id[20];//学号
};
void print1(struct stu t)
{
printf("%c %d %lf %s %d %s\n", t.sb.c, t.sb.s, t.sb.d, t.name, t.age, t.id);
}
void print2(struct stu* ps)
{
printf("%c %d %lf %s %d %s\n", ps->sb.c, ps->sb.s, ps->sb.d, ps->name, ps->age, ps->id);
}
int main()
{
//s是局部变量
struct stu s = { {'w',20,3.14},"张三",30,"202005034" };//对象
//写一个函数打印s的内容
print1(s);//传值调用
print2(&s);//传址调用
return 0;
}
如果大家对函数有不理解的,可以去看我关于函数的文章,下面是链接卡片
对于当前代码有一个疑问,那就是print1() 和print2() 哪个函数更好?
答案:print2()更好
理由:
函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大,
参数压栈的系统开销就会比较大,所以会导致性能的下降。
结论:结构体传参的时候,要传结构体的的地址
剖析:
如果采用print1(),采用的是传值调用。s是一个对象,要开辟一块空间。实参传给形参,形参t为了接受实参s,也要开辟一块相同大小的空间。s有多大,t就多大;s有什么数据,t就有什么数据。要把数据传过去,要为传过去的数据要开辟好一块空间,会准备一块额外的临时空间来接受传过去的数据,空间上会有一些浪费。而且把数据传过去也需要一定的时间,时间上也会有一些浪费。
如果采用的是print2(),采用的是传址调用。传过去的是s的地址,指针变量要接受s的地址,如果是32位平台这个指针变量有4个字节,如果是64位平台这个指针变量有8个字节。传参的时候,传过去的是一个地址,是一个编号,是一个4个字节或8个字节的地址。并没有开辟额外太多的空间,而传过去的地址回来之后还是指向s,因为传过去的是s的地址。
两种的区别:
第二种传址调用的传参效率会更高一些,print2()只是传递了一个指针大小的空间。
第一种传值调用,参数传过去的时候会造成时间和空间上的双重浪费,导致效率低下一 些。而且t是一个临时拷贝,改变t并不能改变s。
⛳2.函数调用的参数压栈
栈是一种数据结构,特点是先进的后出,后进的先出。
假设要在内存中存储1,2,3,4,5的这几个数字。
刚开始栈是个空栈,从栈顶上放了五个数字,给栈中存放数据就叫压栈。
如果要删除数据要从栈顶开始删,删除数据就叫出栈。
⚠️
注意:
只能从栈顶来存放数据,只能从栈顶来删除数据。
所以先进的后出,后进的先出。
⛳3.压栈传参
五、结语
这次带大家了解了结构体的知识,希望能对大家有所帮助。原创不易,还请三连。
为了这篇文章,小编在电脑前写了一个下午,还请大家多多支持。点点赞,关个注
什么的。我才能更有动力,才能创作出更好的文章。