欢迎来到 Claffic 的博客 💞💞💞 👉 专栏:《C生万物 | 先来学C》👈
前言:
这期继续C语言的学习,进行结构体的讲解,值得注意的是,这期的结构体只是简单的介绍和使用,后期会再次详细讲解。
目录
Part1:结构体的声明
1.概念
2.声明和定义
3.变量初始化
Part2:结构体成员访问
1.结构体变量访问成员
2.结构体指针访问成员
Part3:结构体传参
Part1:结构体的声明
1.概念
结构体是一些值的集合,这些值称为成员变量,结构体的每个成员可以是不同类型的变量。
2.声明和定义
一图就懂:
如:
声明一个学生结构体,其中包括学生的姓名 name ,年龄 age ,性别 sex ;
同时定义了两个该类型的结构体变量:s1 , s2.
当然先声明后定义也可以:
为了方便,还可以这样玩:
以上三种方式没有本质区别,都是声明并定义了全局结构体变量 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
原因:
函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。而指针的大小是固定不变的,开销稳定。
总结:
这就是结构体的初级知识介绍了,整体上不算复杂,会定义和使用结构体即可。
码文不易
如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦 💗💗💗