大家好,我是小北。
熟悉的小可爱们都知道,我之前发表过很多关于学习路线的文章,有的有的,还有很多同学催了我好几次,我来说说如何学习C语言吧。
不,鸽王来了。
我们再说一遍,强调一下C语言的重要性:
1.一图胜千言
如果你不想读多余的文字,就看我画的这张思维导图:
2、C语言是不是易学难掌握?
很多学生反映C语言很难。
事实上,与C++、Java等更现代的语言相比,C语言本身的语法特征很少,不像C++那样成了大杂烩。
C语言本身只包含了编程语言最基本的语法,比如变量、if、else、for、while、枚举、结构体等,再加上指针。
但为什么大家都觉得困难呢?
说一下我大一时觉得困难的原因。 主要有两点:
1. 库太少,太原始
用C语言写一个稍微复杂的项目,首先需要实现数据结构和常用算法,更不用说字符串的序列化了。
例如Redis中的SDS、LIST、ZSET、HASH等。
这对于新手来说其实是极其不友好的。
想做点有趣的事,来吧,先写一个链表?
不过Java中直接新建一个效率不太高。
后来学了才知道,这就是编程的高级形式。 写个爬虫直接xx,三言两语就搞定了。
在C语言中,需要裸露地编写和发送网络包、解析HTTP协议、序列化JSON、处理HTTPS(当然也可以导入库,但是因为C/C++弱鸡相当于没有包管理)也相当麻烦。
这就是学习C的新手很容易被解雇的原因。 他们做不出好玩的东西,都是一堆黑框。
2.内存、指针
另外,指针常常是令C语言初学者头疼的问题。
其实指针本身并不难,它就是变量的地址。
但问题是地址是什么?
要理解地址,就需要理解内存,但是由于大部分同学都是大一学C语言的,当时并没有计算机基础知识,所以理解起来其实有点困难。
内存,其实很简单,你只要把它当作一个黑盒子,提供读写的能力即可。
就像快递柜一样,它提供了存储和放置东西的能力:
在哪里读 在哪里写
当然,地址是必须的。 地址与快递柜上的编号相同,快递柜的网格是相对于内存中实际存储的内容而言的。
记住这个快递柜的照片,其实指针你就明白了。
什么是辅助指针?
也就是将另一个格子的编号放到快递柜的格子里,对应的是C语言。 例如:
int a = 10;
int *pa = &a;
int **ppa = &pa;
ppa指向的内存中存储的内容是pa的地址,pa中存储的是a的地址(我不会画图,只是打定主意
那你就要问了,指针和二级指针、更多级指针有什么区别呢?
为什么辅助指针需要两个**?
很简单,如果不需要两个**,怎么告诉编译器这个地方其实是另一块内存的地址呢?
这样编译器就可以做语法检查,不然谁知道你放的是变量的地址还是另一个指针的地址。
更详细的内容,其实我在这篇指针文章里讲过:
但现在从我的角度来看,我感觉指针很简单,似乎很容易理解,也许这就是知识诅咒的原因。
知识的诅咒:一旦我们自己知道某件事,我们就很难想象不知道它会是什么样子。
后来接触了Java,就像发现了一个新世界。
在C语言中,当你申请一块内存的时候,你要记得随时在合适的地方释放它。
发布不当? 抱歉随时等你。
忘记释放? 抱歉,内存泄漏正在等你~
乱写指针? 抱歉,内存越界在等你~
堆栈内存越界? VS下,火辣辣等你来~
这些事情对于每个C来说一定是司空见惯的。
在 Java 等更高级的语言中,只需创建一个新语言即可。
好了,废话结束了,下面是系统学习C语言的方法:
第一阶段:初学者少看书,多看视频
这实在是一个血泪的教训。 大一的时候就傻傻的看课本,然后做课本后面的编程练习。
很难学。 我们都知道,教科书为了保持其严谨性和全面性,往往有一个特点,那就是“不讲人类语言”。
对于C语言来说,初学者有一个难以克服的困难,那就是很容易遇到各种编译和链接错误,而且不知道如何解决:
比如这种很基础的报错,但是初学者看到它往往会惊慌失措。
在这种情况下,我的建议是仔细阅读错误消息。 解决方案通常在这些注释中。 如果解决不了,就复制笔记,到网上搜索一下。
在此阶段您将需要三个文件:
对于每一个点,我只推荐一个我认为最合适的,以免你陷入选择的困境:
CS 50,这是哈佛大学的计算机入门课程。 我忘了我是大一还是大二读的。 那时我感觉自己就像是捡到了宝一样。 链接如下:
关于尤辛,我至今记忆犹新的一点是,老师讲的时候,直接引用了查字典的过程,然后当场把字典撕了。 。 。
另外,本课程采用C语言作为教学语言,这也是非常罕见的。
因为国外很多著名的CS学校的入门课程都会使用类似这样的语言。
但事实上,你会发现在CS 50中,你不会说太多C语言语法。 C语言只是作为传达编程思想、带领你入门计算机的媒介。
而不是教 C.
话不多说,推荐一款我以前在地铁里用过的,浙江大学翁凯教授,去中文大学MOOC搜一下就可以了,下面是链接:
说到这里,我不得不多说几句翁凯老师。 我看过他的几门课程,最直观的感受是:
讲解很透彻,声音很好听,特别注重细节。 我们来贴一下浙江大学匿名课堂系统翁凯老师的点评:
总之,翁凯老师很想用简单的方式教给大家计算机和编程语言的内部原理。
《C程序设计语言》,一本书堪称C语言的圣经。
短短篇幅涵盖了大部分例子,练习也很经典,从hello world开始,到二分查找、二叉树、快速排序、哈希表等等,甚至还写了递归下降的词法分析,帮助您理解复杂的声明。
不过里面的每一个例子都很难理解,需要一点基础,但是不妨碍它作为入门书,可以多看几遍。
顺便说一句,学习编程需要多写,但是很多初学者不知道该写什么。
这里我举一些学习C语言基础语法后可以练习的例子:
就用C语言一遍又一遍地写链表,从最基本的链表到插入、删除、单向、双向、挂环链表。
对链表进行反转、合并、分裂等。
别看基础,但是很多学生到了高三的时候可能会写错。 在这里我们检验他们是否足够细心和合乎逻辑。
如果操作的话会不会断链?
如图书馆管理系统、俄罗斯方块、贪吃蛇等。
这类代码大部分是500-1000,会综合使用函数、文件操作、动态内存、指针等关键东西。
第二阶段:理解记忆、看书、写代码
这个阶段需要掌握一些计算机系统知识才能学好。 例如,虚拟地址与操作系统有关,函数调用堆栈与汇编有关。
再比如,很多同学学习了半天还是不知道变量的声明和定义的区别,以及它们的作用是什么。 这些其实需要了解内存分区。
C语言的核心在于指针和内存。 能否学好、使用好C语言,更多地取决于你是否对计算机结构、存储、运行原理有扎实的了解。
因此,强烈建议在学习C语言的同时,学习补码、数字的二进制表示、内存、汇编等知识,尤其是内存和汇编。 这两个对于深入理解指针和熟练使用很有帮助。
我就不详细介绍了,要介绍的书都在这张思维导图中。
《C与指针》和《深入理解C指针》确实是涉及指针方方面面的好书,墙裂推荐。
两兄弟在理解之后其实并不能帮你提高写代码的水平。 主要原因是编译和链接过程中的一些错误更加清晰,不会造成混乱。
例如,链接过程中常见的错误是符号未找到 ( ) 和符号重新定义 ( )
当您熟悉链接过程和符号搜索过程后,您将能够轻松解决相应的错误报告。
C语言下是汇编。 如果你懂得汇编,就可以直接脱掉C语言的衣服,看看背后的实现。 比如大家都在讨论数组和指针的区别?
你去写一个程序,然后运行gcc -S,看一下汇编代码,你会发现没有什么区别。 。 。
您不需要能够编写汇编,但您可以理解并记住其中的一些。 你不需要刻意记住各种指令和寻址方法。
好了,今天的C语言学习之旅就到此结束了。 其实还有很多东西没有提到,比如Linux C的方向。
主要目的是为了突出C语言本身的学习,不想让观众不知所措,让大家迷失方向。
另外,我还总结了我推荐的这些书:
学完这套,C语言的基础问题就不大了。