【C语言】学数据结构前必学的结构体struct详细
创始人
2024-02-12 03:50:28
0

佛祖说,他可以满足程序猿一个愿望。程序猿许愿有生之年写出一个没有bug的程序,然后他得到了永生。


目录

1、结构体的声明与定义

1.1结构体是什么?

1.2为什么要有结构?

1.3结构体的声明

1.4结构体成员类型

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

2、结构体成员的访问

3、结构体传参


前言:

大家好,我是拳击哥,今天我给大家带来的学数据结构前必学的结构体。本期讲解初始化结构体,如何访问结构体成员以及结构体的传值调用和传址调用。下面我就来讲解它们的用法。


1、结构体的声明与定义

1.1结构体是什么?

什么是结构,我们在学习数组的时候知道了数组是一组相同类型元素的集合,那么数组就是一个结构。而结构体的结构是一些不同类型数据的集合,这些数据称为成员变量。结构的每个成员可以不同类型的变量。


1.2为什么要有结构?

我们生活有很多复杂对象,比如一个人、一本书。一个人他由有姓名,性别,年龄,工资,籍贯来描述。一本书它由书名、作者、出版社、价格来描述。因此这些描述组成复杂对象就是结构。好了说了那么多,如何用代码的形式描述这些复杂对象?请往下看。


1.3结构体的声明

struct stu
{type member1;type member2;type member3;...;
}variavle-list;

上述代码中struct是结构体的类型,stu是标签名根据需求起的一个名称。type是结构体类型member是结构体成员我们可以看到可以有N个成员根据你需求来决定有多少个成员变量。

那么{}里面的所有的成员我们成为member-list也就是成员列表,variable-list是变量列表。有了以上概念的理解,1.2中说到了一个人有姓名,性别,年龄,工资,籍贯。假设要描述一个学生如何做呢,我们来看代码:

#includestruct Person
{//以下五个是结体成员char name[10];int age;char sex[5];float salary;char place[10];
}s4,s5;//声明的同时定义s4,s5
int main()
{struct Person s1, s2, s3;//s1-s3是结构体变量(局部的)return 0;
}

main函数上方的struct Person以及{}里面的内容都是结构体的声明,声明了结构体成员的类型以及大小。{}后面定义的s3,s4是全局的结构体变量。main函数里面定义的s1,s2,s3这三个是局部结构体变量。只有创建了这五个变量,才会在内存中开辟五块块空间。这五个结构体变量里面存的就是刚刚结构体声明里面的五个结构体成员。


1.4结构体成员类型

那么结构体的是一组不同类型的数组的集合,结构体的成员可以是变量、数组、指针、甚至是棋类结构体。下面我们用代码来讲解。


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

1.3中我们定了5个结构体变量,我们看到有三种定义方式。这些定义都是有了结构体类型,才能进行定义的。实际上有三种定义方式:

  • 声明类型的同时,在;前面定义全局的结构体变量
  • 单独定义结构体变量
  • main函数里面定义局部的结构体变量

我们来看一组代码:

#includestruct Person
{//以下五个是结体成员char name[10];int age;char sex[5];float salary;char place[10];
}s4,s5;//声明的同时定义s4,s5struct Person s6;int main()
{struct Person s1, s2, s3;//s1-s3是结构体变量(局部的)return 0;
}

以上代码中,s4,s5属于声明结构体类型的同时在;前面定义全局的结构体变量

s6属于单独定义的结构体变量;s1-s2属于在main函数里面定义局部的结构体变量。

相信大家都已经理解了结构体变量的定义,下面我们来看结构体变量的初始化。


初始化结构体变量。跟数组初始化类似,只不过。结构体变量里面的值可以为不同类型,如以下程序:

#includestruct Person
{char name[10];int age;char sex[5];float salary;char place[10];
};int main()
{struct Person s1 = { "张三",22,"男",12.3f,"美国" };struct Person s2 = { "李四",23,"女",66.2f,"荷兰" };struct Person s3 = { "王五",66,"保密",0.2f,"布吉岛" };printf("%s %d %s %.1f %s\n", s1.name, s1.age, s1.sex, s1.salary, s1.place);printf("%s %d %s %.1f %s\n", s2.name, s2.age, s2.sex, s2.salary, s2.place);printf("%s %d %s %.1f %s\n", s3.name, s3.age, s3.sex, s3.salary, s3.place);return 0;
}

输出结果

张三 22 男 12.3 美国
李四 23 女 66.2 荷兰
王五 66 保密 0.2 布吉岛

当我们想访问结构体成员时,我们用结构体变量 号结构体成员来获取。注意,你初始化什么类型格式符就写什么类型比如"张三"对应的格式符为%s,相信大家已经知道怎样初始化结构体变量了。

总结:

  • 结构体成员类型可以是不同的类型,普通数据类型,数组,指针,甚至是结构体
  • 结构体体变量初始化时,对应着结构体成员类型来初始化
  • 结构体变量访问结构体成员时用.操作符来访问
  • 输出每个结构体成员时应该对应该类型的格式符

最后我们来看一下当结构体成员是结构体时是什么样子:

#includestruct S1
{int a;char b;
};
struct S2
{float c;struct S1 f;double d;
};
int main()
{struct S2 s = { 2.1f,{10,'A'},3.4 };printf("%.1f %d %c %.1lf\n", s.c, s.f.a, s.f.b, s.d);return 0;
}

 输出结果:2.1 10 A 3.4

structS2中定义了结构体类型为结构体,有些像套娃。下面我来讲解它们的用法:

结构体类型为结构体的结构体成员时初始化只需要在{}里面再加一个{}就好了,{}里面就可以初始化该成员为结构体里面的结构体成员。

结构体变量访问为结构体成员为结构体的结构体成员里面的结构体成员需要用到两个.号 。如上方程序,两个点号来获取。结构体类型为结构体里面的成员。


2、结构体成员的访问

结构体成员的访问相信大家在上面的讲解中已经了解到了一个方法那就通过.号来访问,还有一个方法是通过->来访问。这两个访问方法为:

  • .操作符
  • ->符号
#includestruct Person
{char name[10];int age;char sex[5];
};void Print1(struct Person* p)
{printf("%s %d %s\n", (*p).name, (*p).age, (*p).sex);printf("%s %d %s\n", p->name, p->age, p->sex);
}int main()
{struct Person s = { "张三",60,"男" };Print1(&s);return 0;
}

输出结果

张三 60 男
张三 60 男

以上代码是把结构体变量s的地址传给了指针结构体变量p。那么我们就可以通过解引用p再访问结构体成员,访问方式就是.号。->号权限比较大可以不用解引用直接访问成员。


 3、结构体传参

在我们学习数组的时候,数组的参数有传值和传参两中传参方式。结构体也是一样,既能传参又能传址。有以下代码:

#includestruct Person
{char name[10];int age;char sex[5];
};void Print1(struct Person p1)
{printf("%s %d %s\n", p1.name, p1.age, p1.sex);
}void Print2(struct Person* p2)
{ printf("%s %d %s\n", (*p2).name, (*p2).age, (*p2).sex);printf("%s %d %s\n", p2->name, p2->age, p2->sex);
}int main()
{struct Person s = { "张三",60,"男" };Print1(s);Print2(&s);return 0;
}

输出结果

张三 60 男
张三 60 男

张三 60 男

Print1形参里面传过去的就是值,此时p1等同于s。依次通过.号来访问成员变量就好了。

Print2形参里面传过去的就是地址,此时p1的地址等同于s的地址,我们需要先对p1进行解引用才来依次访问成员变量。我们也可以用->直接访问成员变量。


 

本期博客到这里就结束了,相信大家对初识结构体有了新的认识,感谢您的观看。

 Never Give Up

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...