🤔前言🤔
前面我们学完了C语言指针部分的内容,相信大家对指针有了更深入的理解,今天我们来看C语言中的“结构体”。
- 结构体类型的声明
- 结构体初始化
- 结构体成员访问
- 结构体传参
一、😊结构体的声明😊
1.1结构体的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.2结构体的声明
1. struct tag 2. { 3. member-list; 4. }variable-list;
tag是标签名,是可以根据需求改变的。
例如描述一个学生>
struct Stu//Stu是标签名,是可以根据需求改变的 { //结构体成员 char name[20];//姓名 int age;//年龄 char sex[5];//性别 float score;//分数 }Stu;
最后的(;)不能丢 !!!
1.3 结构成员的类型
结构的成员可以是标量、数组、指针,甚至是其他结构体。
1.4 结构体变量的定义和初始化
struct Stu//Stu是标签名,是可以根据需求改变的 { //结构体成员 char name[20];//姓名 int age;//年龄 char sex[5];//性别 float score;//分数 }s4,s5;//s4、s5也是结构体变量 - 全局的 struct Stu s6;//s6也是结构体变量 - 全局的 int main() { struct Stu s1, s2, s3;//s1,s2,s3也是结构体变量的 - 局部的 return 0; }
结构体初始化>
struct Stu//Stu是标签名,是可以根据需求改变的 { //结构体成员 char name[20];//姓名 int age;//年龄 char sex[5];//性别 float score;//分数 }; int main() { struct Stu s1 = { "zhangsan",20,"nan",95.5f }; struct Stu s2 = { "旺财",21,"保密",59.5f }; printf("%s %d %s %.1f", s2.name, s2.age, s2.sex, s2.score); return 0; }
通过(.)操作符可以对结构体成员完成打印
打印结果>
当然结构体也可以嵌套定义>
struct S { int a; char c; }; struct P { double d; struct S s;//嵌套定义一个结构体S类型的变量 float f; }; int main() { struct P p = { 5.5,{100,'b'},3.14f }; printf("%.1lf %d %c %.2f", p.d, p.s.a, p.s.c, p.f); return 0; }
嵌套定义需要打印的时候就需要用两个 (.) 操作符>
二、😜结构体成员的访问😜
- 结构体变量访问成员
结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。
- 结构体指针访问指向变量的成员
struct Stu { char name[20]; int age; }; void print(struct Stu* ps) { printf("name = %s age = %d\n", (*ps).name, (*ps).age); //使用结构体指针访问指向对象的成员 printf("name = %s age = %d\n", ps->name, ps->age); } int main() { struct Stu s = { "zhangsan", 20 }; print(&s);//结构体地址传参 return 0; }
三、 😝结构体传参😝
struct S { int a; char c; }; struct P { double d; struct S s;//嵌套定义一个结构体S类型的变量 float f; }; void Print1(struct P sp) { //结构体变量.成员 printf("%.1lf %d %c %.2f\n", sp.d, sp.s.a, sp.s.c, sp.f); } void Print2(struct P* p1) { printf("%.1lf %d %c %.2f\n",(*p1).d, (*p1).s.a, (*p1).s.c, (*p1).f); //结构体指针->成员 printf("%.1lf %d %c %.2f\n",p1->d,p1->s.a,p1->s.c,p1->f); } int main() { struct P p = { 5.5,{100,'b'},3.14f }; //printf("%.1lf %d %c %.2f\n", p.d, p.s.a, p.s.c, p.f); Print1(p);//传值调用 Print2(&p);//传址调用 return 0; }
上面的 print1 和 print2 函数哪个好些?
答案是:首选print2函数。
原因:
函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
结论:
结构体传参的时候,要传结构体的地址。
🌝小结🌝
今天我们学习了结构体类型的声明、结构体初始化、结构体成员访问、结构体传参,相信大家看完有一定的收获。
种一棵树的最好时间是十年前,其次是现在! 把握好当下,合理利用时间努力奋斗,相信大家一定会实现自己的目标!加油!创作不易,辛苦各位小伙伴们动动小手,三连一波💕💕~~~,本文中也有不足之处,欢迎各位随时私信点评指正!