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函数
原因:函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。
结论:
结构体传参的时候,要传结构体的地址。