指针,是一个让c语言初学者颤抖的坎。
为什么说指针是c语言的灵魂?
因为它提供了对内存的直接控制能力,这是C语言和其它高级编程语言的关键特点之一。
基于这个特点,能衍生出非常多灵活的应用,比如内存管理、数组操作、函数参数传递、数据结构、硬件寄存器配置等等。
这样说,可能有点抽象,不要紧,我刚开始接触指针,也是这感觉。
你可以简单理解成,就像人没有灵魂,废了,c语言没有指针,也废了。
因为很多功能,没有指针实现不了。
下面举几个例子:
1.硬件寄存器访问
单片机的外设功能是通过配置寄存器实现的,这些寄存器通常位于特定的内存地址,我们通常使用指针来访问这些寄存器。
2.函数参数的传递
void copyString(char *dest, char *src) {
while ((*dest++ = *src++));
}
比如这个字符串拷贝函数,如果没有指针,字符串操作将变得非常复杂。
比如我们无际单片机特训营的项目3和项目6,项目搭载了我们自己写的一个轮询架构。
这个架构主要有个功能:任务管理调度和队列。
需要用到回调函数和参数不同文件传递,这些功能必须要用到指针。
我在2018年的时候,还特意录了一套视频,手把手用指针去实现队列,有礼貌的可以找我安排,无套路。
类似的高阶应用还有很多。
比如我们菜单实现链表这种数据结构,需要用到结构体指针。
我对指针的理解,经历了几个阶段。
刚接触时,感觉很陌生很复杂,特别是双重指针,不能完全理解,只是死记硬背了它们的定义方式。
刚做开发的前两三年,我总是感觉自己写的程序,不够专业高大上,很多程序都过度使用指针,看起来更复杂显得专业点,现在回看那程序:真傻杯,脱裤子放屁。
工作6,7年以后,独立做了一些复杂的项目,有物联网网关,有Ble产品,研究过协议栈和模块厂的SDK,也见过很多同事写的代码,对指针又有了新的理解。
第一次做这种项目时,功能太多了,完全Hold不住,可能某几个功能能实现,但把整个项目代码组织整合在一起,就会有各种各样的问题。
我攻克这个难关,花了好几年时间,因为它不像单片机的问题,网上都有答案,也有例程参考,这种问题,是开发经验的问题,网上找不到资料,有也只是零零散散的。
当时,我就像捡垃圾一样,协议栈捡一点,同事那里捡一点,网上又捡一点,然后慢慢消化实践,最后形成系统的知识体系。
其实复杂项目做不稳定,问题的本质,就是缺失程序架构设计和模块化编程能力。
每个功能设计成模块化,然后让一个系统(RTOS),或者我们自己写的那个轮询架构,去统一管理指挥各模块功能执行,就形成了整个项目的软件架构。
而要实现可扩展性,可移植性强的程序架构,指针绝对是绕不开的坎。
所以,我认为,指针是普通工程师和高级工程师的一道鸿沟,搞不定指针,你就无法进阶到高级工程师。
搞定指针,不仅仅是会定义,会使用。
而是对指针的理解深度,能灵活使用它去做一些高阶应用,解决实际产品开发的痛点。
有时,我和无际单片机项目特训营的铁子开玩笑说,如果我当时能碰到这些项目就太爽了,少走好几年弯路。
因为项目3和项目6整体的程序架构,以及每个功能的模块化设计,用指针去实现这些设计的高阶技巧,都是我们自己摸索了很久,才总结出来的经验。
跟着我们教程,参考我们思维和代码,把项目功能从头到尾完整做一遍,对程序架构以及模块化编程的理解,就比较系统了。
如果你是做单片机开发,可能工作了10年,也理解不了指针的精髓,本质上,和工作年限无关,和你接触的项目体量有关。
如果独立做过复杂的项目,绕不开程序架构的需求,也就绕不开指针的应用。
碰到这种瓶颈时,如果有参考,有人带,就会提升地很快,反之,需要耗费很多时间摸索。
最近很多粉丝问我单片机怎么学,我根据自己从业十年经验,累积耗时一个月,精心整理一份「单
片机最佳学习路径+单片机入门到高级教程+工具包」,全部无偿分享给铁粉!!!
除此以外,再含泪分享我压箱底的22个热门开源项目,包含源码+原理图+PCB+说明文档,让你迅速进阶成高手!
教程资料包和详细的学习路径可以看我下面这篇文章的开头。
《单片机入门到高级开挂学习路径(附教程+工具)》
《单片机入门到高级开挂学习路径(附教程+工具)》
《单片机入门到高级开挂学习路径(附教程+工具)》