C语言怎么学?系统学习路线图分享

大家好,我是小北。

阐述一下今天这篇文章,其内容用来分享C语言的系统学习路线,在此顺便着重强调一下C语言的重要性哈。

将我于学习进程里,通过逐个寻觅,在自身有需求去汲纳某一方向知识之际,最终汇总起来的书籍、面经、博客等予以分享,并非网上那种打包下载的形式。

有需自取: 计算机必看经典书单(含下载方式)

如果你不想看冗余的文字,直接看我画的这个思维导图即可:

若前面会书写一些有关C语言的学习经历,要是想径直去看资源推荐以及学习路线,那就直接点击至第三点:

很多同学都反映 C 语言难。

事实上,相较于C++、Java这类更为现代的语言而言,C语言自身的语法特性是相当少的,并非像C++那样变成了一种包含众多元素的混合体。

C语言自身仅仅涵盖了编程语言极为基础的语法,像变量,if,else,for,while,枚举,结构体这类,另外还有一个指针。

但是为什么大家都觉得难呢?

说下我大一时觉得难的原因吧,主要两点:

基于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语言当中举个例子来说。

复制代码
int a = 10;
int *pa = &a;
int **ppa = &pa;

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/spring

B站视频链接: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语言自身,不愿让次要部分占据主要地位,致使大家迷失前行方向。

相关推荐
RFCEO3 小时前
C语言逆向学习基础课 第1课:数组越界与指针操作基础陷阱
c语言·解引用校验·safe_free宏·悬空指针
Rotion_深5 小时前
计算机硬件基础知识
计算机基础
计算机安禾6 小时前
【数据结构与算法】第23篇:树、森林与二叉树的转换
c语言·开发语言·数据结构·c++·线性代数·算法·矩阵
计算机安禾8 小时前
【数据结构与算法】第24篇:哈夫曼树与哈夫曼编码
c语言·开发语言·数据结构·c++·算法·visual studio
Rotion_深10 小时前
计算机系统的组成与体系结构
计算机基础
深邃-10 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·算法
j_xxx404_10 小时前
【创作一周年纪念】365天的坚持:从《初识C语言》到现在的成长之旅,感谢遇见
c语言·开发语言·ai写作·节日
我不是懒洋洋11 小时前
【数据结构】单链表专题(详细代码及配图)
c语言·数据结构·c++·算法·visual studio
daxi15011 小时前
C语言从入门到进阶——第18讲:内存函数
c语言·开发语言·算法