C语言教程08结构体

Posted ITbear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言教程08结构体相关的知识,希望对你有一定的参考价值。

支持我就帮我点击“点赞”+“在看”吧!

许久之前我们学过了C语言中的数据类型,我们知道如果要使用一个变量,我们必须要定义变量的数据类型,变量名以及对变量进行初始化。

实际上我们定义的这个变量只是一个数据暂时存储的地方,如果我们有多个数据要存取,我们会使用数组。

但今天我们需要将问题再次升级,编程到最终是需要解决实际问题的,而不再是简单的几个运算表达式。

如果以前变量是一个整数number这样的类型,那么现在我们的变量将升级到一个真实的人,我们不再是为数据定义变量,而是将对象数据化,C语言就提供了这样一种复合型数据类型,它允许我们自定义,这就是结构体。


什么是结构体

结构体就是将一些数据作为一个整体存储,这些数据可以是不同类型的,如果说数组是相同数据类型的集合,那么结构体可以不确切的说就是不同类型数据的集合,但这些数据都是为了修饰一个相同的对象的,这些数据是构成这个对象整体的,因此叫结构体。

比如一个学生对象,他有名字,年龄,性别,学校等属性,我们将这些属性看做整体,用结构体student保存。

【C语言教程08】结构体

上图就是一个student结构体类型,其中包含名字,年龄,性别,学校四个属性,这些属性也用变量存储,年龄变量定义为整型,其他三个变量用字符数组存储。

很明显可以看出它们的数据类型并不是全部相同,但它们同属于student这个对象,我们去定义一个学生对象时,直接用student这个结构体定义就可以包含其内部的这四个属性,而不需要一个一个变量去声明定义。

【C语言教程08】结构体


【C语言教程08】结构体
结构体如何定义

那么我们的结构体要如何去定义呢?前面我们说过了,结构体是一种我们自定义的复合型数据,那么我们在定义的时候首先要将结构体的结构名、结构体的属性定义好,然后拿着这个结构体去声明变量。

注意的是,我们定义结构体需要在主函数外就定义好,因为结构体是一种自定义数据类型,和之前学过的整型浮点型是一样的,只不过它们是本来就定义好的,而结构体需要我们自己提前定义好。定义结构体必须使用关键字struct。

如果这样没听懂话我们来看一下代码。

【C语言教程08】结构体

除了这种最基本的定义,还有一种方法,就是用typedef创建新类型,只是结构体名字位置不同而已,主要区别在于对变量的声明,前者需要关键字struct+结构体名+变量名来声明,后者直接结构体名+变量名。

【C语言教程08】结构体

同时,我们的结构体内也是可以包含其他结构体的,实际上任何数据类型都可以,结构体无非就是自定义数据类型,当然也可以。

【C语言教程08】结构体


【C语言教程08】结构体
声明结构体变量

对于结构体的定义除了定义结构体本身外还有对结构体变量的声明,我们可以在主函数中像声明整型变量一样声明结构体变量,也可以直接在结构体定义时对变量进行声明,有以下三种方法。

一种是在结构体末尾直接声明变量,

【C语言教程08】结构体

一种是不定义结构体名而直接在结构体末尾声明变量,

【C语言教程08】结构体

最后一种就是之前学的定义整型变量的方法,在主函数里声明,不过如果用的第一种方法定义的结构体就要加struct关键字。如果定义结构体时是用的typedef的方法就不用struct关键字。

【C语言教程08】结构体
【C语言教程08】结构体


【C语言教程08】结构体
结构体变量的初始化

按之前的学习方法,数据类型的定义和声明之后就是数据的初始化了。

结构体变量的初始化有两种方法,一种是在定义声明的时候直接初始化,当然你如果是在主函数内声明的一个结构体变量也是可以用大括号一次性初始化的,类似于数组。

【C语言教程08】结构体
【C语言教程08】结构体
【C语言教程08】结构体

另一种是通过访问结构体变量内的属性进行赋值,

【C语言教程08】结构体
【C语言教程08】结构体

实际上,上述的初始化方法就是接下来要讲的结构体变量元素的访问,访问结构体内元素并对它赋值就可以完成初始化。

上图代码中strcpy方法的作用就是将括号内后者的值复制给前者,我们可以用该方法给字符数组一次性赋值。


【C语言教程08】结构体
访问结构体成员

访问结构体成员很简单,上面也用到了,只需要(变量名.属性名)就好这里就不多讲了,不懂得可以看下图。

【C语言教程08】结构体


需要注意的是属性中包含自身或其他结构体变量的结构体变量,要访问这一类的属性其实只需要一层一层的访问就可。

比如A结构体变量中包含B结构体变量,而我需要访问B结构体内的c属性,于是我可以(A.B.c)。


【C语言教程08】结构体
结构体传参方式

结构体的传参方式和其他数据类型是一样的,也不多讲,我们直接看代码。

【C语言教程08】结构体


【C语言教程08】结构体
指向结构体的指针

指针一直是C语言中难点之一,指向结构体的指针也是上次指针学习中遗留的问题,那么结构体为什么也需要指针呢?

【C语言教程08】结构体
声明和初始化结构体指针



【C语言教程08】结构体

和其他类型一样,struct 结构体名 *变量名;

【C语言教程08】结构体

上述代码定义了一个student类型的指针,它可以指向任意一个student类型的结构体变量,下面我们将之前的代码用指针来重新,通过指针来访问变量属性。

【C语言教程08】结构体

在通过指针访问结构体变量属性的时候,我们用的是(p->name)而不是(p.name),区别就是我们的指针需要用箭头,而如果我们的左部是一个实体就需要用点。

比如(stu1.name)stu1是一个实体,在访问属性时就用点,而当p指针指向stu1后通过指针访问就要用到(p->name)。

【C语言教程08】结构体
结构体指针传参




【C语言教程08】结构体

最后关于传参方式,我们同样可以通过指针,方法和数组类似,不懂的可以回顾一下数组通过指针传参那部分内容,下面就直接看代码吧,

【C语言教程08】结构体


好了,所有关于结构体的内容就在这里了。

从我们最开始的单个变量到多个相同类型变量集合的数组再到今天不同数据类型集合的结构体,我们一步步将数据丰富,直到现在能够用结构体来修饰一个完整的人,形成一个完整的对象。

我们已经踏出了编程路上最重要的一步,用C语言为我们的编程之路奠基,以后我们再学习其他编程语言的时候就能非常快速的掌握。

不同编程语言的区别就在于其语法的不同,当我们学会C语言原理后,就能一通百通了,完全能够自己去尝试学习新的知识,像面向对象编程之类的。


【C语言教程08】结构体
结语

我们的C语言学到这里也接近尾声,古语有云“授人以鱼不如授人以渔”,大家也应该注意到了我的所有代码全部是以图片形式呈现。

为的就是希望大家能够自己掌握每一次所学的内容,也是我作为一个时间稍长的入门者分享给大家的经验吧,无论何时,掌握方法远比结果更重要,希望大家能够融会贯通,举一反三,而不是得过且过。

之后C语言文件的读写内容就作为拓展内容吧,也并不是完全拓展内容,只是因为我想分享的是能够奠基的基础知识。

文件的读写也是C语言的知识点,却不算是最基础的内容,所以对我来说作为拓展也合适,文件的读写结束后我希望能够总结一下这次C语言教程分享的感受,顺带分享一下C语言外面的世界,以此帮助大家找到学习的方向。

最后感谢大家支持,大家一起努力,去更高的山看更远更美的风景!


【C语言教程08】结构体
END
往期阅读
【C语言教程08】结构体
 
【C语言教程08】结构体
 
【C语言教程08】结构体
 



微信公众号:ITbear
-扫码关注我-



以上是关于C语言教程08结构体的主要内容,如果未能解决你的问题,请参考以下文章

C++入门基础教程:C语言的指针与结构体到底怎么用?

C++入门基础教程:C语言的指针与结构体到底怎么用?

剑仙教程易语言的结构体。自定义数据类型。

C语言编程中的结构体原来这么简单

c语言程序设计题,高人来指点一下

C# 结构体的创建和使用