C语言怎么学?系统学习路线图分享
大家好我是小北。阐述一下今天这篇文章其内容用来分享C语言的系统学习路线在此顺便着重强调一下C语言的重要性哈。将我于学习进程里通过逐个寻觅在自身有需求去汲纳某一方向知识之际最终汇总起来的书籍、面经、博客等予以分享并非网上那种打包下载的形式。有需自取: 计算机必看经典书单(含下载方式)如果你不想看冗余的文字直接看我画的这个思维导图即可若前面会书写一些有关C语言的学习经历要是想径直去看资源推荐以及学习路线那就直接点击至第三点很多同学都反映 C 语言难。事实上相较于C、Java这类更为现代的语言而言C语言自身的语法特性是相当少的并非像C那样变成了一种包含众多元素的混合体。C语言自身仅仅涵盖了编程语言极为基础的语法像变量ifelseforwhile枚举结构体这类另外还有一个指针。但是为什么大家都觉得难呢说下我大一时觉得难的原因吧主要两点基于C语言去撰写一个相对更为复杂一些的项目你得在一开始就将数据结构予以实现还要把常见算法也实现一遍更别提字符串以及序列化这些内容了。诸如Redis当中的SDS还有LIST以及ZSET再加上HASH等等这般情况实际上对于新手而言是极其不友好的。想做点有趣的东西来先写个链表而于Java之中直接去New一个LinkedLits直接去New一个HashMap简直高效得不得了。之后后来又学了Python这才发觉它原来是高级编程语言。写个爬虫的时候直接import xx没几句话就搞定了。在C语言当中你得亲自去写Socket来发网络包还得要解析HTTP协议还得序列化JSON处理包含HTTPS这些情况当然啦你能够导入库然而鉴于C/C那如同没有一样弱鸡的包管理着实也挺麻烦的新手学C容易被劝退原因在于此做不出好玩的东西呈现的全是一堆黑框框。另外常另 C 语言初学者感到头疼的就是指针了。指针其实本身不难就是变量的地址嘛。但是问题在于地址是个什么东西要理解地址就得理解内存然而考虑到多数同学学习C语言是在大一的时候此时他们并没有计算机基础知识实际上理解起来还是会稍微有些吃力的。内存实际上并不复杂呀你可以将其视作一个黑匣子它所具备的是读取以及写入的能力。就像快递柜一样提供了存东西、放东西的能力读哪里写哪里肯定是要地址的呀。此地址跟快递柜上已有的编号是同样的事儿。并且呢快递柜的格子那里就如同内存里面实实在在存放着的内容那般。记住这张快递柜的照片其实指针你就理解了。什么是二级指针这个快递柜的格子里放置的东西是另一个格子的编号与之对应在C语言当中举个例子来说。inta10;int*paa;int**ppapa;ppa指向的内存当中所存放的内容是pa的地址而pa存放的是a的地址就不画图了脑补那你要问了那指针和二级指针以及更多级的指针有什么区别呢为什么二级指针就要两个**情形是这样的若不采用两个 ** 那么请问你要凭借何种方式去告知编译器在此处放置的实际上是另外一处内存的地址呢。通过这样编译器才能够去进行语法检查否则的话谁会知道你放置的究竟是变量的地址还是另外一个指针的地址呀。更加详细的内容其实我在公众号这篇指针的文章中讲过为什么指针被誉为 C 语言灵魂然而此刻处于我的立场来看感觉指针是挺简单的好像不难理解说不定是因为知识诅咒这个缘由。知识诅咒指的是一旦我们自身知晓某样事物我们就会发觉很难去想象在不知道它的时候会是怎样的一种情形。 句号。后来接触到 Java如同发现了新大陆一般。当处于C语言范畴内时若要去申请一块内存相应地得随时做到记住于合适之处进行释放。释放得不合适对不起 coredump 随时等着你。忘了释放对不起内存泄露等着你~乱写指针对不起内存越界等着你~栈内存越界VS下烫烫烫等着你~这些事物想来必定是每一位C程序员的日常习见之物了是习以为常的了是司空见惯的了。然而于Java这种更为高级化的语言里面仅仅直接进行new一个的操作便可以了。行了胡扯结束于此处给出一条将C语言进行系统学习的路线吧主要分为两个阶段这实实在在是饱含血泪的惨痛教训我在大一的时候愚笨地会去把课本浏览一遍随后做课本后面的编程练习题。学得艰难无比呀众人皆知课本为留存其严谨性与全面性常常具备一特点即「不说人话」。对于C语言来说呢初学者存在着一个难点是需要去克服的那难处便是极易碰到各种各样的编译错误以及链接错误并且还不清楚该怎么去解决这些问题。比如这种很初级的报错但是初学者往往看到就慌了。要是碰到这种状况我的提议是认真去读那报错给出的提示解决办法常常就在这些note里头要是实在没法解决那就把note给复制了去Google上搜索。这个阶段你需要三份资料针对每一个小点我仅仅推举一份我认为最为合适的旨在防止你陷入那种抉择时的困扰状态进而引发困难表现。推荐计算机导论这门课选择 CS 50它是哈佛的一门计算机入门超棒的课程忘了是在大一下学期还是大二的时候观看的那时感觉就像得到了极其珍贵的宝贝激发了我对于计算机的炽热激情官网课程链接如下https://cs50.harvard.edu/college/2021/springB站视频链接https://www.bilibili.com/video/BV1Rb411378V仍让我现在于脑海中清晰留存记忆的一个要点是这位老师在讲述binary search之际径直列举了查字典的这个流程随后当场亲手模拟查字典。另外这门课是用 C 语言作为教学语言的非常难得。由于当下国外诸多 CS 名校的导论课程都会选用像是 Python、Schema 这般的语言。但实际上你能够发觉于CS 50而言并不会讲述诸多C语言的语法C语言只不过是当作一种传递编程思想、引领你踏入计算机领域的媒介。而不是在教 C 语言。课程下方有条评论说的挺好的有人在别的地方讲这个教得太浅显没有实际用途之类的可我真心很感激这门课程。当年我还是个计算机科学专业的新手感觉这个专业既难又无趣然而看了这个之后世界观都被彻底颠覆了哇原来学习计算机能够如此酷炫原来学计算机科学的人都这般聪慧、自信且富有激情。一门导论课程能让原本对计算机毫无兴趣的学生感受到这门科学的魅力之处从这个层面来讲这门课着实极为伟大。标点。给你推荐一个以前我在地铁的时候都一直在刷的由浙大翁恺老师讲授的你直接去中国大学MOOC上面搜索就行这是链接https://www.icourse163.org/course/ZJU-199001说到此处关于翁恺老师我实在是不得不多叙述几句我观看过他名下的好几门课程而最为直接地浮现于脑海中的感受便是讲解透彻、声音好听而且特别注重细节娓娓道来。贴一张浙大匿名教室系统关于翁凯老师的评价吧一句话翁凯老师真心想要把计算机内部原理还有编程语言以深入浅出的方式传授给大家。这本书被称作 C 语言圣经。短短篇幅内涵盖了 一部分里很大比例的众多例子习题皆为经典之作起始于对 hello world方面的示例延伸至二分查找部分、有关于二叉树的示例、快排示例、哈希表示例等甚至借助递归下降方式完成了词法分析相关内容以此助力你去理解复杂的声明。但想要明晰其中每一个示例确实存在着某种程度的困难这需要具备些许基础才行然而这并不妨碍将其视作入门书籍大可以多翻阅若干回。对了一直说学编程要多写但是很多初学者也不知道写什么。于此处我给出若干学完C语言基 本语法之后能够用于练手的例子咱们先别看基础然而好多同学到了大四这种时候可没准都写不对了这儿考察是不是足够细心还有逻辑是不是够缜密。会不会操作着就把链给断了。大多是这种代码量处于500至1000的范围会把函数、文件操作、动态内存、指针这些关键内容综合起来运用。处于这个阶段那是得掌握一些计算机系统知识才能够学好的像虚拟地址这一方面它是和操作系统存在关联的而函数调用栈这类它们又和汇编有着关系。再比如说好些学了较长时间的同学依旧不太明晰变量声明与定义之间的差异又比方说extern究竟有着怎样的作用而此种种其实是需要去领会内存分区相关内容的。C语言的关键要点在于指针以及内存范畴而能不能将C语言学好并且运用得良好这更多的是取决于是否具备扎实的计算机结构方面知识还有存储方面知识以及运算原理方面知识。所以做出强烈的建议在学习C语言之际去了解一下补码去了解数的二进制表示这事而内存以及汇编等知识也需同步跟进特别是内存和汇编这两者它们对于深刻理解指针且熟练运用有着极大的帮助。我就不仔细介绍了要介绍的书都在这张思维导图里了有关指针各个方面的好书是《C和指针》还有《深入理解C指针》真心强烈推荐。对于这俩兄弟而言就算懂了实际上也没办法帮你提升写代码的水平关键在于针对一些编译、链接过程当中出现的报错会变得更加明确不会处于懵的状态如此而已。例如在链接进程期间常常会出现的错误情形是符号处于未被找到的状态即undefined reference以及符号出现了重新定义方面的情况也就是redefinition。在对链接过程熟悉起来对符号查找过程熟悉清楚往后将对应报错加以解决就会变得顺手随心应对自如。推荐最先建议大伙去阅览 CSAPP 的第七章在看完这一章之后你进而能够明白静态链接、动态链接、加载、目标文件、重定位、符号表这类事物。这本书的主要内容其实体现在副标题链接、装载、库。这本书所涵盖的内容是偏向于底层范畴的最好是当你对于操作系统、指针以及内存这些方面都具备一定程度的基础之时再去进行阅读不然的话很容易陷入困惑不解的状态。为何要去学习汇编语言呀是缘故于在C语言之下便是汇编倘若会汇编那你便能够直接将C语言的外皮给扒下来去瞧瞧背后的实现情况就好像大家都在探讨数组与指针存在着啥区别呢你去编写、完成一个程序随后在完成该程序后使用gcc -S这个方式进行处理接着查看一下所生成的汇编代码当你进行查看之后你就会察觉到计算机在进行访问操作时所涉及的指令并没有什么不同之处相关指令全部都是以基地址加上偏移的这种形式呈现的。对汇编而言不需要会书写要会看懂其中一部分并记住完全没必要去特意费心地记住各类指令以及各种寻址方式。现在今日的C语言学习进程就到此为止了实际上存在诸多内容未曾提及像是Linux C这一方向的主要是为了突显C语言自身不愿让次要部分占据主要地位致使大家迷失前行方向。