想要学习结构体,你不妨看看这篇文章,至少帮助你节省两个半月时间~~~~~~

发布于:2022-12-08 ⋅ 阅读:(329) ⋅ 点赞:(0)

结构体其实没有那么复杂,看完这篇文章,你也能教人!


在现实生活中我们描述一个人一个物品不可能只看单一的角度,同样的我们程序员也不可能一个int 一个char地敲出来一个立体的人,这就是结构体出现的先决条件!

结构体的基础知识

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

结构的声明

 struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}Stu;//分号不能丢

就像上面的示例这样,我们描述一个学生可以选择从姓名;年龄;性别;学号等等角度来说明,这些角度就叫做结构体成员。
在这里插入图片描述
1.这里的struct就叫做结构体关键字
2.Stu叫做标签,表示我们创建的这个结构体变量的大类,整体struct Stu就叫做结构体类型,记住了是两个合起来才算做一个类型,这种类型我们叫做自定义类型,顾名思义也就是可以自己定义的类型!
3.这一列列就是成员列表,每一个=都叫做结构体成员
4.这里的stu(原图搞错了,应该是小写),叫做结构体变量
struct Stu就相当于int
stu 就相当于创建的a之类的变量!

结构体变量的定义和初始化

在这里插入图片描述
这样的情况就是在定义结构体的时候顺带着把结构体变量给创建了。
在这里插入图片描述
这就属于先定义结构体,然后再创建变量。
两者之间的优劣我倒是还没有看的太清楚,但是他们之间比较大的一个区别我想可能就是一个是全局变量,一个是局部变量吧。
我们之前无论是创建整型变量还是指针变量是不是都习惯在创建好之后初始化一下?
这里同样可以初始化结构体变量:
在这里插入图片描述
初始化要记得加上大括号,而且像这样的初始化还必须按照顺序来,
在这里插入图片描述
提前给兄弟们看一下,这是可以随心所欲写结构体成员的方法,后面我们还是会讲的。

struct point
{
	int x;
	int y;
}p;
struct Stu
{
	struct point;
	int age;
};//分号不能丢

兄弟们要注意一点的也就是我们在一些情况下是需要嵌套定义结构体的,这样的操作在我们的编程里面是需要的,所以我们有必要学习一下如何嵌套定义结构体:
在这里插入图片描述
若是使用上面的定义方法,我们就需要使用{ }来框住嵌套的结构体;
若是选择了下面的方法就需要了解我们下面要讲的结构体访问的知识!

结构体成员的访问

通俗地来说,访问结构体成员有两种方法,上面我们所讲的都是第一种:
1.结构体变量.结构体成员:
在这里插入图片描述
就拿这个最复杂的,嵌套结构体来讲:
还记不记的我们先是struct Stu s了一下,这里的s就是我们讲的结构体变量,而结构体成员则是 {
struct point p;
int age;
}
这么看来我们s.p,p既是上一个结构体之中的结构体成员,又是下一个结构体中的结构体变量,所以这才会有s.p.x s.p.y这样的写法!
还有一种写法呢,是使用结构体指针来实现的:

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;
}

这样子的代码基本模式是:结构体指针—>结构体成员
(*结构体指针).结构体成员
下面的就是通过解引用操作变成上面的,原理是一样的!

结构体传参

那么最后的最后,阿涛还要跟兄弟们强调两点:
1.结构体指针类型的写法:我们之前已经说过了struct Stu才是一个完整的结构体类型,那么指针类型就是指向对象的类型加一颗*,我们不难猜出结构体指针的类型是struct Stu(标签可以自己随便写)* 。
2.结构体传参和别的传参是一个道理,我在之前的博客里面就和兄弟们说过这个问题,传值调,和传值调用,数组传参……
我们在使用结构体传参的时候,最好使用结构体指针,这样子既可以剩下一大块形式参数对于实际参数的临时拷贝的空间,还可以根据这个地址直接实现对实际参数的改变,而就像刚才说的,形式参数知识实际参数的一份临时拷贝,你对于形式参数进行任何改变是不会影响外面的实际参数的!
因此无论是从面子还是李子上来看,选择传址调用都是上上之选!!!

辛苦了兄弟们,我写到这里已经很累了,相信如果兄弟们真的是看到这里眼睛也一定很酸疼了,今天我们就到这里吧!
希望我的这篇博客或多或少能对兄弟们起到一点作用!
百年大道,你我共勉!!!!

本文含有隐藏内容,请 开通VIP 后查看