解决指针类c语言问题的感受,【C语言教程08】结构体

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

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

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

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

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

什么是结构体

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

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

fbf025a5ebb31082fb3c27c582dba56f.png

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

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

d77ce4de31457f8a3a204b384b272986.png

ac3b65cac7dc894e7ebb2ca89ae492cf.png

结构体如何定义

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

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

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

118c3a79671d44ce3b804397328b2826.png

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

dbb92e20836694539d0c5786511a881e.png

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

2962c05ab2eae4f33fa94d2b94f612a9.png

ac3b65cac7dc894e7ebb2ca89ae492cf.png

声明结构体变量

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

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

4b0697f7130bc8959618d46d4f710223.png

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

fa87a0a80003faee3fd15e03611570f4.png

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

e62c53da2babac9390066075491dc8c7.png

32e0d76ebb2cf880c38f5ee2d9ab19f0.png

ac3b65cac7dc894e7ebb2ca89ae492cf.png

结构体变量的初始化

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

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

1876ee4c383e9662576a70fd0fe5d271.png

1828511e31c3e3d15b141eca8d7b81b1.png

570408ae2f8a30b02fcc820e9599ae39.png

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

4f34bbab6be96ed6914f755c0e422cc0.png

0170748e05ebc01bc4416c6ccc120029.png

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

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

ac3b65cac7dc894e7ebb2ca89ae492cf.png

访问结构体成员

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

e78fab58cd0734e090545971fa879638.png

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

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

ac3b65cac7dc894e7ebb2ca89ae492cf.png

结构体传参方式

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

f46814d4c861050c06ea8494a306f779.png

ac3b65cac7dc894e7ebb2ca89ae492cf.png

指向结构体的指针

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

b8bc8085781d227a503797a108536c3e.png

声明和初始化结构体指针

b8bc8085781d227a503797a108536c3e.png

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

bbc923327d323204d0fdacefcbd2098b.png

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

52b4d79efb5d4c23b65ea433df887eb2.png

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

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

b8bc8085781d227a503797a108536c3e.png

结构体指针传参

b8bc8085781d227a503797a108536c3e.png

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

e3d484502e4b1aa17cb4fdbeced5b6cd.png

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

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

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

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

ac3b65cac7dc894e7ebb2ca89ae492cf.png

结语

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

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

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

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

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

ac3b65cac7dc894e7ebb2ca89ae492cf.png

END

往期阅读

417254ff7e00ea5b626ad0522f300e47.png

417254ff7e00ea5b626ad0522f300e47.png

417254ff7e00ea5b626ad0522f300e47.png

微信公众号:ITbear

-扫码关注我-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值