结构的基础知识:
结构是一些值的集合,这些值称为成员变量。结构的成员可以是不同类型的变量。
j结构成员的类型:可以是标量,数组,指针,也可以是其他结构体。
//结构体声明
#include<stdio.h>
struct stu //struct是结构体关键字,stu是结构体类型的名字
{
//大括号中是成员变量,是结构体的相关属性
//拿类型(可以理解为图纸)创建了main 函数中的对象s(可以理解为用图纸创建出房子)
char name[20];
int age;
char id[20];
}stu; //分号不能丢
int main(void)
{
//这里的s是局部变量
struct stu s = { {'w',20,3.14},"张三",30,"20250424"};
return 0;
}#include<stdio.h>
struct B
{
char c;
short s;
double d;
};
struct stu //struct是结构体关键字,stu是结构体类型的名字
{
struct B sb; //结构体成员的类型是sb,结构体成员可以是另外一个结构体
char name[20];
int age;
char id[20];
}stu; //分号不能丢
int main(void)
{
//这里的s是局部变量
struct stu s = { {'w',20,3.14},"张三",30,"20250424" }; //结构体嵌套初始化
//printf("%c\n", s.sb.c); //运行结果为w
//printf("%s\n", s.id); //运行为20250424
//为什么sb后面不用箭头,因为sb是个结构体变量,不是指针,所以访问自己的成员用.就行
struct stu* ps = &s;
printf("%c\n", (*ps).sb.c); //w
printf("%c\n", ps->sb.c); //w
return 0;
}//下面写一个函数打印s的内容
#include<stdio.h>
struct B
{
char c;
short s;
double d;
};
struct stu
{
struct B sb;
char name[20];
int age;
char id[20];
}stu;
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);
//打印出 w,20,3.14,张三,30,20250424
}
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);
//打印出 w,20,3.14,张三,30,20250424
}
int main(void)
{
struct stu s = { {'w',20,3.14},"张三",30,"20250424" };
//写一个函数打印s的内容
print1(s); //print1函数打印s要传参,print1在主函数内传了一个结构体对象,所以在函数调用时print1里面传了一个结构体对象t来接收s,不需要返回,前+void,打印t就是打印s的内容
print2(&s); //用print2来打印s,这里传的是一个结构体变量的地址&s,在实现的时候,地址传过来用指针变量,ps调用的是print2,指向的是s,把s的地址传过去,通过ps打印里面的信息,ps是结构体指针
return 0;
}两次打印出的结果是一样的,但是:
一.传值调用,参数传参,s传过去,需要t临时开辟空间来接收s传过来的数据;
二.传址调用,&s传过去的只是一个地址编号,不需要开辟空间,效率高,还可以改变s 里面的数据。
函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大,参数压栈的同开销比较大,所以会导致性能高的下降。
结论:结构体传参的时候,要传结构体的地址。