知识点:
1、结构体类型的声明
2、结构体初始化
3、结构体成员访问
4、结构体传参
1、结构体类型的声明
1.1 结构的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

1.2 结构的声明
例如描写一个学生:
//描述一个学生
struct stu
{
//结构体成员
char name[20];//名字
int age;
char sex[10];//性别
float score;
};//注意;不能丢
1.3 结构成员的类型
结构的成员可以是变量、数组、指针,甚至是其他结构体。
1.4 结构体变量的定义和初始化
有了结构体类型,怎么定义变量呢?
类比内置类型:int float……
代码实例:
定义变量:通过类型创造变量
//描述一个学生
struct stu
{
//结构体成员
char name[20];//名字
int age;
char sex[10];//性别
float score;
} s3;//s3是结构体变量——全局的(声明类型的同时定义变量)
struct stu s4;//s4是结构体变量——全局的
int main()
{
struct stu s1, s2;//s1,s2也是结构体变量——局部的
return 0;
}
初始化:定义变量的同时赋初值
//初始化:定义变量的同时赋初值
struct stu
{
//结构体成员
char name[20];//名字
int age;
char sex[10];//性别
float score;
};
int main()
{
struct stu s1 = { "张三", 19, "男" ,65.5f };
return 0;
}
补充:结构体嵌套初始化
//结构体1
struct S
{
int a;
char ch;
};
//结构体2
struct P
{
double d;
struct S s;//结构体嵌套
float f;
};
#include<stdio.h>
int main()
{
struct P p = { 5.5, {99,'a'},85.1f };//结构体嵌套初始化
//打印p结构体1中的内容
printf("%d %c\n", p.s.a, p.s.ch);
return 0;
}
2、结构体成员的访问
①结构体变量访问成员:结构体变量.成员名(.操作符)
②结构体指针访问指向变量成员:结构体指针->成员名(->操作符)
代码实例:
//2、结构体成员的访问
// . 结构体变量.成员名
// -> 结构体指针->成员名
//结构体1
struct S
{
int a;
char ch;
};
//结构体2
struct P
{
double d;
struct S s;//结构体嵌套
float f;
};
#include<stdio.h>
void print1(struct P sp)
{
//结构体变量.成员名
printf("%.2lf %d %c %.2f\n", sp.d, sp.s.a, sp.s.ch, sp.f);
}
void print2(struct P* sp)
{
printf("%.2lf %d %c %.2f\n", (*sp).d, (*sp).s.a, (*sp).s.ch, (*sp).f);
//结构体指针->成员名
printf("%.2lf %d %c %.2f\n", sp->d, sp->s.a, sp->s.ch, sp->f);
}
int main()
{
struct P p = { 5.5, {99,'a'},85.1f };//结构体嵌套初始化
print1(p);//传值调用
print2(&p);//传址调用
return 0;
}
3、结构体传参
代码实例:
//2、结构体成员的访问
// . 结构体变量.成员名
// -> 结构体指针->成员名
//结构体1
struct S
{
int a;
char ch;
};
//结构体2
struct P
{
double d;
struct S s;//结构体嵌套
float f;
};
#include<stdio.h>
void print1(struct P sp)
{
//结构体变量.成员名
printf("%.2lf %d %c %.2f\n", sp.d, sp.s.a, sp.s.ch, sp.f);
}
void print2(struct P* sp)
{
printf("%.2lf %d %c %.2f\n", (*sp).d, (*sp).s.a, (*sp).s.ch, (*sp).f);
//结构体指针->成员名
printf("%.2lf %d %c %.2f\n", sp->d, sp->s.a, sp->s.ch, sp->f);
}
int main()
{
struct P p = { 5.5, {99,'a'},85.1f };//结构体嵌套初始化
print1(p);//传值调用
print2(&p);//传址调用
return 0;
}
上面的print1和print2函数哪个好些呢?
答案是:首选print2函数
原因:
函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。
结论:
结构体传参的时候,要传结构体的地址。