目录
Part1:结构体的声明
1.概念
2.声明和定义
3.变量初始化
Part2:结构体成员访问
1.结构体变量访问成员
2.结构体指针访问成员
Part3:结构体传参
前言
这期继续C语言的学习,进行结构体的讲解,值得注意的是,这期的结构体只是简单的介绍和使用,后期会再次详细讲解。
正文
Part1:结构体的声明
1.概念
结构体是一些值的集合,这些值称为成员变量,结构体的每个成员可以是不同类型的变量。
2.声明和定义
一图就懂:
如:
声明一个学生结构体,其中包括学生的姓名 name ,年龄 age ,性别 sex ;
同时定义了两个该类型的结构体变量:s1 , s2.
当然先声明后定义也可以:
为了方便,还可以这样玩:
3.变量初始化
初始化就是给结构体成员附一些初始值
继学生结构体:
初始化:
Stu s1 = { "claffic",18,"boy" };
注意:初始化内容一定按顺序与类型匹配
那结构体里有结构体怎么办?
嵌套初始化即可:
typedef struct Point { int x; int y; }; struct Node { int data; struct Point p; struct Node* next; }n1 = { 10,{1,3},NULL }; struct Node n2 = { 20,{2,4},NULL };
Part2:结构体成员访问
1.结构体变量访问成员
结构体变量成员是通过点操作符 (.) 来访问的,点操作符接受两个操作数。
struct student s; strcpy(s.name, "claffic"); // 字符串不可直接用 = 赋值 strcpy(s.sex, "boy");
2.结构体指针访问成员
有时我们得到的不是结构体变量,而是结构体指针,也可以访问结构体变量。
struct student { char name[20]; int age; char sex[5]; }; void Print(struct student* ps) // 传递指针 { // 解引用访问 printf("name = %s age = %d sex = %s", (*ps).name, (*ps).age, (*ps).sex); // 指针访问 用 -> 操作符 printf("name = %s age = %d sex = %s", ps->name, ps->age, ps->sex); } int main() { struct student s = { "claffic",18,"boy" }; Print(&s); // 传递地址,取地址 return 0; }
运行结果:
Part3:结构体传参
传参与成员的访问大差不差
也是有两种类型:结构体变量传参 和 结构体指针传参
我们接下来对比一下两种方法:
struct S { int data[1000]; int num; }; struct S s = { {1,2,3,4}, 500 }; //结构体传参 void Print1(struct S s) { printf("%d\n", s.num); } //结构体地址传参 void Print2(struct S* ps) { printf("%d\n", ps->num); } int main() { Print1(s); // 传结构体 Print2(&s); //传地址 return 0; }
以上方式展示了两种传参的方式,
试想一下, Print1 和 Print2 哪个好?
首选 Print2
原因:
函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
而指针的大小是固定不变的,开销稳定。
结构体传参的时候,要传结构体的地址
总结:
这就是结构体的初级知识介绍了,整体上不算复杂,会定义和使用结构体即可。
码文不易
如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦 💗💗💗