c语言学习4大段位,青铜,白银,黄金,王者,测测你在哪一级?第四季back2school的第五节课,陈强老师讲解c语言学习路线,助力大家早日成为c语言大拿。
1 常见编程语言
图上列举了几种目前我们常用的软件编程语言。从左边的机器语言、汇编语言开始,从一个计算机的角度来看,越底层的语言越不利于人类理解,也就不容易编写。
一般c++语言以后我们才称为高级语言,因为出现了类和对象的概念,更符合我们人类的思维方式。
c语言它没有类,但是它有结构体、联合的概念,也算比较高级,所以c语言一般都是学习其他语言的基础。c语言比汇编语言要高级一点,已经非常容易理解和编写,限制少,通用性很强,小到几m频率的单片机,大到服务器,c程序都可以运行,移植容易。但是它还是非常底层,因为它和硬件的关系非常铁,所以它的执行效率很高,现在的操作系统和追求效率的大型软件还是使用c/c++父子俩来编写的。
2 c语言学习路线
学习c语言软件编程需要掌握哪些知识呢?上图将软件编程需要的技能列举了几个部分,编程语言跟学习外语的路线类似:
1)最基本的语法,然后组织语言,将想法表达出来,具体使用哪种方式表达,也就是算法和数据结构这才是软件编程的精髓和灵魂。刚才讲到,c语言和硬件关系密切,所以学c语言编程最好了解一下计算机的结构组成包括嵌入式硬件结构,以及计算机外设资源,尤其是对于单片机开发来说不懂硬件就没法编程。
2)高级用法,操作系统是躲不过去的坎,了解操作系统的工作原理,对学习编程非常有帮助,然后就是利用可运行的平台做项目练习,也就是应用部分。
青铜小白入门c语言的话,要学习哪些内容?首先就是c语言的基本语法,比如变量与常量、数据类型、运算符、数组、函数、结构体。还有c语言最最重要的指针部分,指针是c的灵魂,掌握了前面的基础,就可以进阶到白银。
白银阶段这里,需要掌握指针的一些高级用法,比如函数指针,内存管理、堆栈、队列、结构体联合链表等复杂的数据结构,文件的读写,预处理命令,编译环境和工具,当然还要掌握复杂一些的程序结构。
到黄金阶段,基本就是一名高手了,这时候需要补充做项目的经验,数据结构和算法仍然是一个程序的灵魂,最后编写任何c语言的项目就可以随心所欲了,现在c程序应用最多的地方,一个是单片机编程,另一个是基于操作系统linux的编程,当然了这需要大量练习,需要无数的打怪升级的锻炼才可以达到王者的随心所欲。这里推荐几本比较好的书,c语言祖师爷写的《c程序设计语言》、另外《c和指针》也非常不错。
3 知识点举例
c语言强大的地方是指针,最容易令人迷糊的地方也是指针。这里我们来看一个例子:
ip是一个指针,*ip则指向该地址下的变量;把一个变量取地址之后付给ip,那么在指针变量中存储的就是这个变量的地址了。如果要获取这个变量实际的值,则在ip前面加*,所以地址的使用要格外仔细。
那么地址和数组直接是什么关系呢,下图是一个比较经典的面试题,需要搞清楚数组指针和指针数组。用变量a 给出下面的定义:
下面再看结构体和指针的例子:
这是stm32f4 hal库uart外设库的一个函数,函数的入口是结构体指针,也就是结构体的首地址。这是通过typedef定义的数据类型。在内部调用函数hal_uart_mspinit()的入口参数是结构体指针huart。
结构体在实际c语言项目中经常用来描述事务的综合属性,类似其他高级编程语言中类的概念,由此才有面向对象的意思。在stm32 库函数中大量使用了结构体指针的方式,通过传递结构体的地址而不是整个结构体,调用函数的开销会更小,效率更高。
这里说到stm32库函数,有必要说一下c语言的一大应用领域,微控制器开发。微控制器也就是单片机,处理能力和存储资源有限,开发流程还是要在pc端编辑并编译完成之后,下载到单片机上运行,开发语言以面向底层的c语言为主,涉及的操作系统也是实时操作系统。由于mcu种类繁多,程序编写方式也不统一。
上图是arm 的cmsis标准,即arm cortex 微控制器软件接口标准,使用cmsis,可以为处理器和外设实现统一的软件接口,从而简化软件的重用、缩短新开发人员的学习过程,并缩短开发时间。我们在使用c语开发单片机时,多参考厂家的sdk是非常有必要的,目前各大半导体厂商提供的sdk非常有参考价值,大家学习单片机c语言编程可以模仿sdk的写法,规范的写每一行代码。
除了单片机开发之外,基于pc或系统的编程中,linux系统对c语言天然友好。不同于windows下单片机开发的集成开发环境keil mdk,在linux下可以很方便的独立调用编译链工具。比如这里hello.c c文件的编译过程有4步,预处理、编译、汇编和链接。
每一步调用工具链的哪个工具产生什么文件怎么实现的,这几步搞明白了对c对操作系统的理解会更深入。
linux下的编程内容庞大,比如网络编程,线程与进程等。
当然开发以上内容除了c语言以外c++、python、java也是常用的语言,对同一个项目,哪种语言可能都可以实现,但是不同的语言实现起来的方式和难易程度不同,所以大家学习c语言之后也要打开自己的视野。
大家在学习c语言编程的时候不要只是在pc机上玩vc++,来回折腾51单片机,高级点单片机的只知道个32,也要多关注新技术的发展,目前很多单片机像乐鑫的esp32/树莓派的pico已经支持micropython,而且开源库很多。目前mcu已在iot领域大量应用,而且在超低功耗的微控制器设备上开发和部署的机器学习模型比如tinyml。使机器学习可以在低延迟、低功耗和低带宽的边缘设备上运行。所以大家学习技术的时候一定要睁眼看世界,关注新事物,尤其是现在大火的人工智能领域。
最后,给新手朋友几点学习的建议:大家学习软件编程时,要避免学校里上课考试的模式,而是以项目式学习,通过不断的做项目练手,关键是保持对技术的追求和兴趣,一路打怪升级不放弃。此外,千万不要闭门造车和搞深山修炼,学东西要不断的与外界交流,把自己融入技术圈里,多观摩、多请教、多交流,成为王者指日可待。
手撕代码最快的方式呢就是保持一颗进取的心,跟随高手的脚步,踏踏实实,不断打怪不断升级。
CoreOS与红帽OpenShift联手推动混合云原生服务
美国允许在夜间使用无人机
哪里需要AI,哪里就有昇腾
功能原型系列:装备与测试介绍
有毒气体检测仪的使用需要注意哪些内容?
C语言学习路线讲解
为拓展可挠式OLED事业,三星新增四大战略
助焊剂产品的基本知识
新一代协作机器人如何改善手工工作的性质
三相异步电动机应用
电机控制芯片DSPADMC401的原理、特点及应用研究
基于AVR单片机的RFID阅读器设计方案
小米6或将于4月11日发布:海报曝光 虹膜识别没跑!
Intel高管披露Arc显卡合作厂商?官方否认
STC89LE516实现RS485总线LED显示屏控制系统
ER3B-C10机器人上市,广泛应用于工业场景和教育场景
全自动红外体温筛查仪背后的技术知识
中国商飞人工智能创新中心在北京正式揭牌成立
傅里叶变换红外光谱仪微型化研究取得了突出进展
中国电信2019年1月份运营数据整体情况报告