c语言结构体相关箭头运算符和点号运算符的联系以及c语言的“索引”思想

最近,我在看linux的内核源码,里面使用大量的结构体类型定义、结构体类型变量定义、结构体指针变量、结构体内部成员等元素。其中,大量使用了结构体指针变量访问结构体内部成员的"箭头运算符->",以及使用结构体变量名访问结构体内部成员的"点号运算符."。两者的相似点:都是实现了结构体变量内部成员的读写访问。不知道大家有没有这样的疑问,利用指针变量解引用符号"*"和"点号"运算符就能实现结构体变量内部成员的读写访问,为什么还要发明一个"箭头符号->"呢?

也就是说:

p->member;不是应该写成(*p).member吗,为什么还要发明箭头运算符"->"呢?

答案:

(1)p->member等效于(*p).member,两者是完全一致的,也就说箭头运算符->等效于解引用+点号运算符

(2)c语言之所以发明"->"箭头运算法是为了让代码看以来更简便,更易读,避免了括号()加解引用运算符(*)的使用繁琐。

(3)箭头运算符"->"本身就有指针指向的含义,左侧的变量值表示首地址,右侧的变量表示要访问的结构体成员变量,"箭头运算法"本身代表"指针(地址)寻址思想"。点号运算符"."在汉语中有"的"含义,本身符合结构体这个大内存格子变量内部包含小内存格子结构体成员的含义,点号运算符左侧的变量为结构体变量,点号运算符右侧的变量为结构体成员变量,"点号运算符"本身代表父与子的关系。

扩展:暗含的索引思想

p->member;

str.member;

以上两种方式都是实现了结构体变量内部成员的读写访问,都暗含了一个非常重要的变成思维就是"线索或者索引"的概念。

无论是多么复杂的数据结构,都是从结构体的地址(其实暗含了结构体首元素的首地址,双首地址思想)为起始开始的。也就是俗称的"从头开始捋清楚"。只要是找到了这个地址"线头"就可以一步步使用"箭头运算法"或者"单号运算符"完成结构体内部成员的访问。

这种情况尤其是父结构体内部包含子结构体,子结构体又包含孙结构体, ...的情况,无论包含多少层结构体,都是从最外层父结构体或者结构体指针开始像"剥洋葱"一样一层一层的倒找内部成员,也暗含了"无法从内部结构体开始为"线索"实现结构体内部成员的访问"。

相关推荐
神仙别闹26 分钟前
基于C语言 实现 Windows PE 文件解析
c语言·windows·microsoft
LDR0061 小时前
LDR6020:多 Type‑C 端口角色管理与外设上电顺序的智慧核心
c语言·开发语言·云计算
東隅已逝,桑榆非晚2 小时前
新手入门指南:认识 C 语言文件操作(上)
c语言·开发语言·笔记
社交怪人3 小时前
【A×B】信息学奥赛一本通C语言解法(题号1036)
c语言
Eric 辰东4 小时前
【C 语言程序的编译和链接】详解编译链接过程
c语言·笔记·算法·学习方法
星恒随风4 小时前
C语言数据结构排序算法详解(上):从插入排序、希尔排序到选择排序、堆排序
c语言·数据结构·笔记·学习·排序算法
SoftLipaRZC4 小时前
C语言数据在内存中的存储:整型与浮点型的秘密
c语言·开发语言
社交怪人4 小时前
【2的幂】信息学奥赛一本通C语言解法(题号1037)
c语言
wyjcxyyy4 小时前
java反序列化-cc1链
java·c语言·开发语言
玖玥拾5 小时前
C/C++ 基础笔记(一)
c语言·c++·笔记