c语言链表指向下一个结构体指针,「C语言指针」链表学习前导知识——结构体和它的众多小细节...

有相当一部分同学在学习C语言过程中,学到链表的时候总是绕不过圈圈,迟迟不得要领。

97be031553e157a9f31747074c7aff3d.png

本文尝试着从小白视角对链表的建表算法进行从无到有的解读。

在正式研究链表之前,我们先来学习结构体。跟指针一样,结构体也是一种数据类型,只不过这种数据类型可以存储多种属性的复杂数据,在使用前需要定义类型。

2a203d2052b7a3ac4ccc300bdbc58ccf.png

它的定义形式很简单:struct 名字{成员表列;};比如对于一个学生,他可以由姓名、性别、学号、成绩等等组成,而这些数据可以分别采用字符串、字符、整型数组、float类型的数据存储。

所以我么就可以定义一个学生的结构体,里面包含了他的各种属性,只是需要注意我们只是定义了一种数据类型,如果要向内存申请存储单元还要继续声明变量。

4a717fff288687cf167c41bbec445564.png

接着我们来聊一聊它的使用,变量能够使用,前提是你可以将它表示出来。对于简单的数据类型(比如int),我们可以采用剥洋葱的方式用结构体名加'.'的方式把它“点”出来。

8e01a5eff4380f3dc060674eccf1ea23.png

在这里还有一个小细节,就是对于字符串的处理。字符串不能被赋值,只能采用字符数组或者字符拷贝函数strcpy()等方式处理。字符串的名字表示首地址,是地址常量,常量不能被赋值。

定义结构体类型之后系统不会分配单元,只有定义变量系统才会分配单元。当然你也可以定义结构体数组,括号中的数字表示长度,每个单元所占大小就是结构体类型规定的长度。

29529733596a7fcd3d6fcb261361580d.png

我们在之前提到,想对某一段一段内存进行操作的前提是【把该变量表示出来】。

对于结构体指针,可以望名知意:这是一个指针,只不过这个指针里面存放的地址是一个结构体变量的地址。

bb6efcde5ab9520b8a4a6c7e9a4756ae.png

对结构体指针而言,访问它所指向的结构变量的成员可以采用取值运算符*,比如struct (*stu).name。当然,我们在实践中更喜欢采用的方式是箭头方式:struct stu->name。

7f31b9f6322df984da2b2ee35810fc66.png

我们来看一点有意思的内容:++p->age、(++p)->age、(p++)->age、p++->age。其实C语言中类似的表达式比比皆是,在看到的时候只要保持头脑清醒,时刻关注运算优先级和自增的处理就可以很轻松的解决了,读者可以自行推演。

d52c506bffa6d5cc19db2017e2efcd58.png

在C语言中,想使用结构体变量必须在前面标注struct,以表示这是一个结构体变量(虽然在.cpp文件支持省略的写法),这种写法往往显得代码冗长,所以程序员往往青睐使用起别名关键字typedef。

9d307403721ec7b9f5ac76f5f41acca3.png

你可以在结构体最前面使用关键字struct,这样就可以为结构体类型或者对应的指针类型起别名,在使用过程中也会少写一个struct,何乐而不为呢!

06c826ee3d2db9b92b2c556a6d6547a1.png

只是对于初学者而言,可能很难理解为结构体指针类型起别名的方式。这里只需把它当作一种等价替换就可以,为结构体指针起别名之后会把指针标志*给藏起来,但是在实际使用中要时刻注意,这仍旧是一个指针。

感谢阅读,学习使人强大。

c3e09b25c106426c788c9ac0ee83baf1.png

举报/反馈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值