您现在的位置是:首页 >技术杂谈 >【C生万物】 结构体篇网站首页技术杂谈

【C生万物】 结构体篇

Claffic 2023-07-16 12:00:02
简介【C生万物】 结构体篇

 欢迎来到 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
", s.num);
}
//结构体地址传参
void Print2(struct S* ps)
{
	printf("%d
", ps->num);
}
int main()
{
	Print1(s);  // 传结构体
	Print2(&s); //传地址

	return 0;
}

 以上方式展示了两种传参的方式,

试想一下, Print1 Print2 哪个好?

首选 Print2 

原因:

函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
而指针的大小是固定不变的,开销稳定。
结构体传参的时候,要传结构体的地址


总结: 

这就是结构体的初级知识介绍了,整体上不算复杂,会定义和使用结构体即可。

码文不易 

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。