推广 热搜: csgo  vue  2023  angelababy  gps  信用卡  新车  htc  落地  控制 

如何系统学习 C 语言?

   2023-08-30 网络整理佚名1600
核心提示:语言本身只包含了编程语言最基本的语法,比如变量、if、else、for、while、枚举、结构体等,外加一个指针。一句话,翁凯老师是真的想把计算机内部原理、编程语言以深入浅出的方式教给大家。语言,更多在于是否拥有扎实的计算机结构、存储、运算原理方面的知识。语言的同时去了解一下补码、数的二进制表示、内存、汇编等知识,尤其是内存和汇编,这两个对于深刻理解指针和熟练运用有很大的帮助。

大家好,我是小北。

熟悉的小可爱们都知道,我之前发表过很多关于学习路线的文章,有的有的,还有很多同学催了我好几次,我来说说如何学习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语言的基础问题就不大了。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON