【声明】:本次对结构体的学习先做一个简单的介绍和初识,接下来还会有进一步更深入的学习,尽请期待吧!
结构体
结构体的声明
结构的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构成员的类型
结构的成员可以是标量、数组、指针,甚至是其他结构体。
想知道如何定义结构体?那就看代码吧!!
1.结构体变量的定义和初始化
struct B
{
char c;
short s;
double d;
};
struct Stu //struct结构体关键字,Stu结构体类型
{
//成员变量
struct B sb;//结构体的成员也可以是其他结构体
char name[20];
int age;
char id[20];//学号
}s1,s2;//s1和s2也是结构体变量
//s1,s2是全局变量
int main()
{
//struct Stu s;//拿Stu这个结构体类型创建一个s对象
//s是局部变量
struct Stu s = { {'w',20,3.14},"张三",21,"20210711" };//结构体变量(对象)初始化
2.结构体成员访问. ->
printf("%c\n", s.sb.c);
printf("%s\n", s.id);//用.操作符访问结构体成员
struct Stu* ps = &s;//struct Stu*:结构体指针,通过ps打印s里面的内容
printf("%c\n", (*ps).sb.c);//对ps进行解引用操作
printf("%c\n", ps->sb.c);//因为ps是指针所以也可以使用->操作符,但sb不是指针,它是一个结构体变量,不可以使用->,应使用.
return 0;
}
打印结果:
结构体传参
结构体传参数的两种写法:1、传值调用;2、传址调用
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)//用结构体变量接收s传过来的值给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)//用结构体指针接收s传过来的地址给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()
{
struct Stu s = { { 'w', 20, 3.14 }, "张三", 21, "20210711" };//对象
//写一个函数打印s的内容
//1、传值调用;
print1(s);//print1调用
//2、传址调用;
print2(&s);//print2调用
return 0;
}
打印结果:
讨论:结构体传参数的两种写法哪一个好呢?
答:传址调用好
为什么呢?
答:函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象(传值)的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。因此,结构体传参的时候,要传结构体的地址。
函数调用的参数压栈解释:如下图
压栈:给栈中存数据
参数传参的动作也叫压栈操作