[编程开发] 如何学习 C 语言?

[复制链接]
new_jam 发表于 2023-10-14 07:55:29|来自:北京 | 显示全部楼层 |阅读模式
如何学习 C 语言?
全部回复5 显示全部楼层
疯狂de少年 发表于 2023-10-14 07:55:39|来自:北京 | 显示全部楼层
作为一名写了好几年 C 语言,也给很多留学生讲过 C/C++ 的学长来回答下吧。
我用 C 语言写了很多小工具,比如malloc、free,挂载到fuse上的filesystem,简易版svc等等。
总的来说,有上万行以上吧,对于指针、内存这些C语言关键点,也还算掌握得不错。
跟着我的方法学习,C语言一定没问题~~



之前出过很多学习路线的回答,有操作系统的、有 C++ 的,不少同学已经催了我几次了,让我讲下 C 语言怎么学。
首先,送大家一份我整理的包含几十本经典 C/C++ 电子书大全合集:



获取方式可以看看这篇文章,附带了电子版的PDF下载链接,赶紧收藏起来吧:
C/C++必读书籍推荐| 附下载方式
再老生常谈下,强调下 C 语言的重要性哈:



  • C 语言应该是绝大部分同学的编程第一课。
  • 对于非 CS 专业的同学,学 C 语言主要是掌握一些基本的编程方法,C 语言只是媒介。
  • 但是对于 CS 科班的同学,C 语言是后续的计组、体系结构、操作系统、编译原理等课程的基石,对于 C 语言本身甚至程序设计语言基础原理的深入理解都是应该掌握的。
对于大部分初学者,学习C语言的目的是希望做一名合格的程序员,开发出靠谱的软件来。但是学了C语言的基本语法后,发现只能开发“黑底白字”的DOS程序,完全没有漂亮的界面和生动的交互。于是学数据结构,学算法,学操作系统,越陷越深,越来越难,最后迷茫了,不知道学C语言能做什么,认为学习编程很难,开始怀疑自己,甚至想放弃。
其实,这是很多初学者都会踩到的一个坑!C语言本身是一门很简单的语言,提供的实用功能不多,大部分要借助操作系统、第三方库、单片机来完成。也就是说,只学C语言基本什么也做不了,也基本找不到工作。
C语言是一门通用性的语言,并没有针对某个领域进行优化,在实际项目中,C语言主要用于较底层的开发,例如:

  • Windows、Linux、Unix 等操作系统的内核90%以上都使用C语言开发;
  • 开发系统组件或服务,用于支撑上层应用;
既然C语言的应用这么多,为什么很多读者觉得它什么也做不了呢?
我们先说一个概念,就是库(Library)。库就是编程专家写好的代码,我们可以拿来直接使用,这样能够节省开发成本,提高开发效率,并且库代码的执行效率、严谨性、安全性和规范性要明显优于我们自己编写的代码,市场上有很多优秀的库,有的收费,有的免费,我们要善于利用这些库,尽量不要重复造轮子。
库一般分为两种:

  • 编程语言的开发者在开发编程语言的时候,一般都要预先写好常用的代码,或者说常用的功能,例如输入输出、数学计算、文件操作、网络操作、日期时间、错误处理、字符串处理等,这些由官方编写的库称为标准库(Standard Library),它们随编程语言一起发布,可以认识是编程语言的一部分。
  • 有一些组织机构或者个人也会开发一些库,有的是为了盈利,有的是业余爱好,有的是本公司正在使用的代码,开源出来造福人类,这些库称为第三方库(Third-party Library)。
如何学习?
一、一图胜千言

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


二、C 语言易学难精?

很多同学都反映 C 语言难。
实际上,相比 C++、Java 之类的更加现代的语言, C 语言本身的语法特性非常少,不像 C++ 成了一锅大杂烩。
C 语言本身只包含了编程语言最基本的语法,比如变量、if、else、for、while、枚举、结构体等,外加一个指针。
但是为什么大家都觉得难呢?
说下我大一时觉得难的原因吧,主要两点:
1. 库太少,太原始
用 C 语言写个稍微复杂点的项目,你需要上来先把数据结构、常见算法先实现一遍,更别说字符串,序列化这些了。
比如 Redis 里 SDS、LIST、ZSET、HASH等。
这其实对新手极其的不友好。
想做点有趣的东西,来,先写个链表?
而在 Java 里直接 New 一个 LinkedLits、HashMap,简直不要太高效。
再到后来,学了 Python,才发现这才是编程的高级形态,写个爬虫直接 import xx,几句话就完事了。
而在 C 语言里,你需要裸写 Socket 发网络包,还要解析 HTTP 协议,还要序列化 JSON,处理 HTTPS 这些(当然,你也可以导入库,但是由于 C/C++ 弱鸡等同于没有的包管理,也挺麻烦的。
这就是新手学 C 容易被劝退的原因,做不出好玩的东西,全是一堆黑框框。
2. 内存、指针
另外,常另 C 语言初学者感到头疼的就是指针了。
指针其实本身不难,就是变量的地址嘛。
但是问题在于地址是个什么东西?
理解地址,就需要理解内存,但是鉴于大多数同学学习 C 语言,都是在大一,那时候没有计算机基础知识,其实理解起来还是稍微吃力的。
内存,其实也很简单啊,你就把它当做一个黑盒,提供了读和写的能力。
就像快递柜一样,提供了存东西、放东西的能力:


读哪里?写哪里?
当然是需要地址啊,地址就跟快递柜上的编号一样,而快递柜格子里就相对于内存中真正存放的内容。
记住这张快递柜的照片,其实指针你就理解了。
什么是二级指针?
就是快递柜格子里放的是另外一个格子的编号,对应到 C 语言举个例子:
int a = 10;
int *pa = &a;
int **ppa = &pa;
ppa 所指向的内存存放的内容是 pa 的地址,pa 存放的是 a 的地址(就不画图了,脑补
那你要问了,那指针和二级指针以及更多级的指针有什么区别呢?
为什么二级指针就要两个**?
很简单啊,不用两个 ** 的话,你怎么告诉编译器,这个地方放的其实是另外一个内存的地址?
这样编译器才能去做语法检查,不然谁知道你这是放的变量地址还是另外一个指针的地址啊。
更加详细的内容其实我在这篇指针的文章中讲过:
为什么指针被誉为 C 语言灵魂?
不过现在站在我的角度,觉得指针很简单,似乎很好理解,也许是知识诅咒的原因。
知识诅咒:指的就是一旦我们自己知道某样东西,我们就会发现很难想象不知道它的时候会是什么样子。
后来接触到 Java,如同发现了新大陆一般。
在 C 语言里,申请一个内存,你得随时记得在合适的地方释放。
释放得不合适? 对不起 coredump 随时等着你。
忘了释放? 对不起,内存泄露等着你~
乱写指针?对不起,内存越界等着你~
栈内存越界?VS下,烫烫烫等着你~
这些东西想必是每一位 C Programmer 的家常便饭了。
而在 Java 这类更加高级语言中,直接 new 一个就行了。
好了,扯淡完毕,在这里给出一条系统化学习 C 语言的路线吧:
第一阶段:初学少看书,多看视频

这真的是血泪教训,我大一会傻乎乎的去把课本看一遍,然后做课本后面编程练习题。
学得那叫一个艰难呀,大家都知道,课本为了保留其严谨性和全面性,往往都具有一个特点,那就是「不说人话」。
对于 C 语言,初学者有一个难点需要克服,就是容易遇到各种编译、链接错误,而且不知道怎么解决:


比如这种很初级的报错,但是初学者往往看到就慌了。
遇到这种情况,我的建议是仔细读报错的提示,解决方法往往就在这些 note 中,如果实在解决不了,就复制 note 去 Google 上搜。
这个阶段你需要三份资料:

  • 一是补 CS 基础概念,也就是计算机导论
  • 二是一本 C 语言的好书。
  • 三是一个优质的 C 语言视频
对于每一点,我都只推荐一份我觉得最合适的,避免你陷入选择困难症:

  • 计算机导论
CS 50,这是哈佛的一门计算机入门神课,忘了是在大一下还是大二看的了,当时觉得如获至宝。 链接如下:
https://cs50.harvard.edu/college/2021/spring
让我现在还记忆尤新的一个点,是这个老师讲到 binary search 的时候,直接举了查字典这个过程,然后现场手撕字典。。。


另外,这门课是用 C 语言作为教学语言的,非常难得。
因为现在国外很多 CS 名校的导论课都会采用类似 Python、Schema 这样的语言。
但其实你会发现,在 CS 50,不会讲多少 C 语言的语法,C 语言只是作为一种传递编程思想、引领你入门计算机的媒介。
而不是在教 C 语言。

  • C 语言视频
不多说了,推荐一个我以前在地铁都在刷的,浙大翁凯老师教授的,直接去中国大学 MOOC 搜索即可,这是链接:
https://www.icourse163.org/course/ZJU-199001
说到这,我不得不多说两句翁凯老师了,我看了好几门他的课,最直观的感受是:
讲解透彻、声音好听,而且特别注重细节,贴一张浙大匿名教室系统关于翁凯老师的评价吧:


一句话,翁凯老师是真的想把计算机内部原理、编程语言以深入浅出的方式教给大家。

  • C语言书
《C程序设计语言》,一本被称作 C 语言圣经的书。
在短小的篇幅中,涵盖了 <stdio.h>、<string.h> 中的大部分例子,习题也都是经典,从 hello world 开始,到二分查找、二叉树、快排、哈希表等,甚至还用递归下降写了词法分析,帮你理解复杂的声明。
不过要看懂里面的每一个例子,也是有一定难度的,需要有一点点基础,但是不妨碍作为入门书,可以多看几遍。
对了,一直说学编程要多写,但是很多初学者也不知道写什么。
在这里,我给出一些学完 C 语言基本语法后,可以练手的例子:

  • 链表
就用 C 语言把链表翻来覆去的写,从最基本的链表插入、删除、单向、双向、环装链表。
到链表反转、合并、分割等。
别看基础,但是很多同学到大四了,可能都写不对,这里考察是否足够细心、逻辑是否缜密。
会不会操作着就把链给断了。

  • 写点小东西
比如图书管理系统、俄罗斯方块、贪吃蛇之类。
这种代码量大多在 500 - 1000,会综合运用函数、文件操作、动态内存、指针这些关键的东西。
第二阶段:搞懂内存,看书、写代码



这个阶段,是需要掌握一些计算机系统知识才能学好的,比如虚拟地址就和操作系统相关了,而函数调用栈这些又和汇编相关。
又比如很多学了很久的同学,还不太清楚变量的声明和定义区别,extern 又有什么作用,这些实际上就需要理解内存分区的东西。
C 语言的核心就在于指针、内存,能不能学好、用好 C 语言,更多在于是否拥有扎实的计算机结构、存储、运算原理方面的知识。
所以强烈建议在学习 C 语言的同时去了解一下补码、数的二进制表示、内存、汇编等知识,尤其是内存和汇编,这两个对于深刻理解指针和熟练运用有很大的帮助。
我就不仔细介绍了,要介绍的书都在这张思维导图里了。

  • 深入学习指针
《C和指针》、《深入理解C指针》,真的是涉及指针方方面面的好书,墙裂推荐。

  • 编译、链接
这俩兄弟懂了其实也不能帮你提高写代码的水平,主要是对于一些编译、链接过程的报错,更加的明确,不至于懵。
比如链接过程中常见的错误是符号未找到(undefined reference)和符号重定义(redefinition)
当你熟悉链接过程,符号查找过程之后,解决对应的报错也会得心应手。

  • 汇编
C 语言之下就是汇编,会汇编,你就能直接把 C 语言衣服扒掉,看看背后的实现,比如大家都在讨论数组和指针有什么区别?
你去写个程序,然后 gcc -S 一下,看下汇编代码,你就会发现没啥区别。。。
汇编不需要会写,会看懂部分记得,大可不必去刻意的记住各种指令、寻址方式。

另外,我推荐的这些书籍,我也都汇总了:



可以在这里下载,都包含在里面了:
计算机必看经典书单这一套学完,C 语言基本问题不大。
有需要的可以点赞后在评论区留言,我发给你~~
记得帮我 @编程指北 点个赞哟~~
qkw6358 发表于 2023-10-14 07:55:57|来自:北京 | 显示全部楼层
有一句说的特别对“C生万物,编程之本”!C语言在计算机体系占据着不可替代的位置!



如果你不知道如何学习C语言,那么,跟着下面的学习路线图来学吧,附带学习视频哦!


C语言配套学习视频:
1小时透彻理解C语言指针

完整视频:
指针如此简单--1小时透彻理解C语言指针配套资料:https://pan.baidu.com/s/14bnf2W2RPbgz-k6Fw9rm7g   提取码:2vk4
C语言提高深入浅出

完整视频:
C语言提高深入浅出配套资料:https://pan.baidu.com/s/1jhJplSj4-ZPzSecz1elr4A 密码:ov17
C语言数据结构 培养架构师思维

完整视频:
C语言数据结构 培养架构师思维配套资料:https://pan.baidu.com/s/1C4cm3tVmR0Wea9q6ut-xYQ 密码:4wi6
最适合自学的C++基础视频_深入浅出版全套资料

完整视频:
C++教程_C++教程视频_C++教程下载配套资料:https://pan.baidu.com/s/1brlk0Ab 密码:n66u
匠心之作 C++从0到1入门学编程

完整视频:
C++| 匠心之作 从0到1入门学编程配套资料:链接:https://pan.baidu.com/s/1PbkG54Pcrmlof-61Sl8fPg 提取码:q0i4
使用策略模式实现游戏技能系统

完整视频:
使用策略模式实现游戏技能系统配套资料:https://pan.baidu.com/s/1hrtys59uDd7aROyv3p1E9A 提取码:mpxa
linux典藏系列之 网络编程

完整视频:
linux典藏系列之 网络编程配套资料:https://pan.baidu.com/s/1pNonADaGLktICkpeqTUCCQ 密码:yfyy
C++核心编程 打造你的核心编程技能

完整视频:
C++核心编程_打造你的核心编程技能配套资料:https://pan.baidu.com/s/1F_tvZX3h6MrlCl3U6RUJtA 密码:cka8
C++关系型数据库编程 | 4天从入门到精通

完整视频:
C++关系型数据库编程配套资料:https://pan.baidu.com/s/1YETuEInQMzuhcpYpns4Xjg 提取码:i1qk
C++ STL 高级教程 | 深入浅出版

完整视频:
C++ STL 高级教程 | 深入浅出版配套资料:https://pan.baidu.com/s/1sli_-2F9IENir1ZeLjXRMQ 密码:cj6j
步步打造-frameQT自定义界面

完整视频:
步步打造-frameQT自定义界面配套资料:https://pan.baidu.com/s/1QpFmOEV6QgfJoMd3KsD0Pg  提取码:y4a8
QT从入门到实战完整版

完整视频:
QT从入门到实战完整版配套资料:https://pan.baidu.com/s/1o2MzfY-Z_5jUj5ym8BXcAg 提取码:xapf
MongoDB从配置到编程

完整视频:
MongoDB从配置到编程配套资料:https://pan.baidu.com/s/13rHVy53uCNZuAumik2ojrQ 密码:8d5k
学好linux? 从零基础系统编程开始
完整视频:
零基础学会LINUX系统编程配套资料:https://pan.baidu.com/s/17E_5UIK_naKCbSIy7IHVfg 密码:3l77
半小时快速搭建网络攻防环境-Kali操作系统

完整视频:
半小时快速搭建网络攻防环境-Kali操作系统配套资料:https://pan.baidu.com/s/1yLqeSZ9_zcvc0HXCzfHTFA 密码:49ds
C++与分布式数据库开发

C++与分布式数据库开发资料:http://pan.baidu.com/s/1o7SwLrs 密码:2g5t
c++与安全协议开发

完整视频:
C++与安全协议开发配套资料:http://pan.baidu.com/s/1pLDOmXd 密码:wyp6
C生万物之游戏内存劫持

完整视频:
C生万物之游戏内存劫持配套资料:https://pan.baidu.com/s/1BYDSXZurz2FSIpnpAaWOXw 提取码:9bzr
金山游侠开发

完整视频:
C++ 金山游侠开发|黑马程序员资料:http://pan.baidu.com/s/1nuFD7o1 密码:sabw
C++干大事系列之游戏篇:Qt飞机大战

完整视频:
C++干大事系列之游戏篇:Qt飞机大战配套资料:https://pan.baidu.com/s/11XD9Mabj9IouaWwNj_0-SA 提取码:9zuz
QT跨平台小游戏开发—黑白棋

完整视频:
QT跨平台小游戏开发-黑白棋配套资料:https://pan.baidu.com/s/1oA4skNRKcpdtIGdg7nKrwQ  提取码:e2wa
【毕设项目】使用QT实现跨平台开发“快播‘播放器

完整视频:
【毕设项目】02使用QT实现跨平台开发“快播‘播放器配套资料:https://pan.baidu.com/s/1dYy_wkuOX5MDI0jbvSNcLg 密码:wylm

更多C++学习教程

C++免费教程_C++免费教程视频_C++教程免费下载_最新C/C++免费视频,C/C++视频下载,C/C++教程_最新
调皮 发表于 2023-10-14 07:56:11|来自:北京 | 显示全部楼层
这个应该是几个月前的提问题了,但是C语言的问题过十年问也不晚。

一、C语言是最值得学习的语言
学习C语言,首先要明确地告诉自己:C语言是世界上最值得学习的语言

  • 如今决定学习任何一门其他语言之前,都要先考察这个语言有什么成功项目吗?唯独C语言没有必要问,因为世界上所有最最重要的的系统中,都必然有C语言的身影。比如操作系统内核、高级语言底层等等。
  • 为什么C最适合担任系统核心?主要原因可能是C语言具有和汇编语言的对应性,一条C语言代码,对有经验的人来说,可以转换为一条或多条汇编代码,也就是说编译结果具有可预测性。C代码不会在被编译时被加上奇奇怪怪的修饰,也不会在二进制兼容性方面带来大问题。这种稳稳当当的语言,一切都在掌握之中,一切荣耀归属于coder,一切错误也归罪于coder。
  • 学习C语言的同时,就自然而然的理解了硬件与操作系统的浅表一层。比如int有几个字节的问题,已经是QQ加群验证是否是程序员的一个标准了(笑),这从侧面说明了学习C语言时确实会关心底层软硬件的实现。C语言简单的基于值类型的数据类型体系(引用靠指针,指针本身也是值类型),保持了和硬件底层的一致性(即内存、缓存、寄存器只能保存值),不会出现其他语言比如C#那样既有值又有引用反而对理解底层实现制造了障碍。
  • 从某些角度上讲,C语言从设计上来说并不是为了让我们更好的写逻辑代码而设计的,它真的是“只能是这样”,没有对错好坏之分。因为计算机体系结构就是这样的、汇编就是这样的,所以C语言大致也只能是这样的,谁也不能随意捏造它。它足够简单,评论它的设计优劣意义不大。
废了这么多口舌,是为了坚定思想,端正态度,只有抱着“最好”的态度,才能排除杂念,勇往直前。时代在进步,某些东西易逝,而另一些东西持久。很多编程大师都用亲身经历告诉你,C语言永远值得用最纯粹的态度去学习。

二、学习C语言的初步路线
我们说学习任何东西,都有先把书读厚,再把书读薄的过程。也就是说,先学习大量知识和细节,然后总结归纳、提纲挈领,就彻底掌握了这门知识。
而学习C语言,一开始就不那么厚 : ) 。大道至简,只需一本:


这书中英文版均可,前面谈到过,C语言本身特性并不多,所以这些年来从C89到C99到C11,只是增加了一些细枝末节的改动,现在你用C89的书仍然没有什么大问题(当然还是用第二版C99吧)。不用买一堆入门到精通、高级C、本质论、Primer互相参照。C语言的教材、参考书都是这薄薄一本。
C语言的语言本身很容易“精通”,一旦你理解了指针、函数指针等问题,基本知识方面就横行无阻了,很少会遇到完全没见过的语法。
C语言基本学习过程真的没有太多好讲的,假设每天学习两小时,每周学习5天,只要动手多写例子,把例子保存好随时翻看,那么C语言的语法基础很快就能全部过完一遍,估计半个学期的时间就能看完。难点可能是在指针的使用,这需要多看资料、多画图、多写代码尝试,给自己点时间强行突破即可。
但是问题也在这里,由于宏和指针的存在,万事皆有可能。很多经典的C代码,真的是没见过之前根本不知道还能这么用,举个入门级的例子,Linux内核中的一个通用链表:

// 定义链表节点结构
struct list_head
{
        struct list_head *next, *prev;
};
// 创建链表
#define LIST_HEAD_INIT(name) {        &(name), &(name) }
#define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name)
// 判断链表是否为空
static inline int list_empty(const struct list_head *head){return head->next == head;}
// 运行时初始化链表
#define INIT_LIST_HEAD(ptr) do { (ptr)->next = (ptr); (ptr)->prev = (ptr); } while (0)

// 我自己写的测试函数,方便读者阅读:
int main()
{
   LIST_HEAD(my_list_head);
   printf("列表是否为空  %d\n", list_empty(&my_list_head));
   return 0;
}

C语言写的经典代码经常会用这种“过度简洁”的语法,初学之后会看得云里雾里的。如果你能看懂,又会有一个更大的问题——这个list_head结构体里面,没有数据。自定义数据应该放在哪呢?这又需要深一步研究了。
稍微高深点的比如任意动态语言的源码,比如Lua的源码,对于刚学懂了C语言的同学来说,真是每个字都懂,连在一起就不认识的感觉。还有一些经典算法,比如Subversion的源码,都很值得深入分析,只要理解一个模块,就会收获巨大。具体的例子这本书里提到好几个:


赏析一下书中前几个问题:
第1章 正则表达式匹配器
第2章 Subversion中的增量编辑器:像本体一样的接口
第3章 我编写过的最漂亮代码
第4章 查找
可能是知识结构不足,本书后面的例子我读起来有点不清晰。对C语言学习者来说,前几个例子非常值得一读,可以迅速意识到自己的不足并迅速成长。本书建议先找电子版试读。

PS:关于C语言开发环境
1、Windows平台,请使用Dev-C++。不要用Visual Studio,对C语言支持不完整。
2、安装Linux虚拟机,桌面版本的,比如Ubuntu,现在貌似“深度Linux”挺火,没试过。

三、关于进阶
C语言的进阶会遇到两个主要问题:
1、明白基础以后,缺少大量练习。而大量练习本身会非常费时间,因为在顾及语法的同时要顾及逻辑问题,捉襟见肘。这时候的初学者,逻辑抽象能力和语法使用都是半吊子,非常难受。
2、阅读代码方面,C语言的成熟工程代码一般会比较冗长,函数中间夹杂着很多宏和指针操作,我阅读的感觉是读后面忘前面,非常难入手。如果不明白某个函数的功能,强行将其读懂非常费时费力,容易放弃。

这样一来,学完基本知识之后的进阶之路真的非常陡峭。
我个人大胆给出C语言进阶的一个相对缓和的路线:
1、实现链表、可变长数组、哈希表等基本数据结构,实现方便的string结构体。然后大胆的用在自己写的程序中。不要怕写的有BUG,也不要怕效率不高。现代编程中容器是非常关键的武器,没有容器寸步难行。而编写容器时会练到封装、指针、内存分配,都是C语言进阶时极其重要的方面。
2、如果工作学习中用到C语言就再好不过,比如现在很多本科、硕士毕业论文都要用C语言实现,那么这时候抓住机会多练练,是最好的。
3、尝试ACM竞赛题,ACM竞赛和OnLineJudge平台,比如
http://tyvj.cn/
    类似有很多,北大、北邮这种大学都有类似的网站,上面不仅有题目,还有算法、有答案、有提示,还能直接在网页上做题。刷题可以获得及时反馈,一旦你AC了3道题,那种成就感可以让你继续下去,哈哈。不过除非你兴趣就是算法本身,那么刷30道题基本就可以了,毕竟这种刷题会猛烈地提高算法能力,但是对架构能力的提升几乎没有任何作用,对大多数人来说不建议刷太多。
4、非常重要的私货:如果除了做练习题以外没有练习机会,那么请把C语言放一下,快速学习Python(首选)、Lua(次选)、JavaScript(或TypeScript更好)等能够立即实现功能效果的语言。学习好的动态语言有两方面好处:
第一:表层来说,能迅速提高逻辑代码的编写能力。用C语言构思半天才能写一点的功能,用动态语言会快速的多,动态语言将我们从内存分配、容器等基本问题中解脱出来,直接实现我们想要的效果。用动态语言实现之后,可以用C语言仿写这些逻辑代码,相当于按图索骥,直达目的。
第二:深层来说,较高级的语言对底层的语言编写有强烈的指导意义。我个人在工作中使用C++用了很长时间,但是总感觉遇到瓶颈无法突破。直到我学习了Python,写了一两个比较复杂的工具,从另一个角度突破了逻辑设计的屏障,才感觉到编程水平有了明显提高。
第三:在掌握了Lua或Python后,再找资料一边学习一边看Lua和Python的C源码,对提高C语言水平有实质性的帮助。

这里举一个简单的例题:一个文件中有很多对ID和字段,这些ID和字段对分别代表另一个文件。而另一个文件内容可能会链接到更深一级的文件。怎样读取这些文件组成一棵树呢?
这个问题对能力达到一定水平的人是基础问题,而对于初学者来说可能是一个门槛。这种问题我的建议是用Python或Lua的表、字典来解决,然后理清思路之后,改写为C代码。

四、总结
写了很多,感觉再写下去个人私货就太多了,并不客观。
总之C语言的学习是知识点少、难点多。上面针对初学提供了一些建议,进阶方面写了很多个人的心得体会,希望能给学习C语言的初学者和进阶者提供一些帮助。
如何学习C语言这是个挺重要的大问题,读者若有意见和建议,可以讨论交流,有问题我可以修正。
asdfasd 发表于 2023-10-14 07:56:31|来自:北京 | 显示全部楼层
作为C语言课程的老师,我也来凑个数吧。
在实际教学过程中,有不少同学觉得C语言学习比较困难,就我的理解,主要有两点原因。第一,C语言的语法知识太多、太琐碎;第二,反复地做算法类的编程练习,不感兴趣,不愿写程序,进而觉得入门困难。
分析了上面的原因后,我们采取了对应的策略:
首先,入门时仅讲最少需要的语法知识,一些额外的语法知识先不要学。比如++、--、复合赋值运算符、逗号运算符、switch-case语句、do-while语句等。实际上不学这些语法,也可以写出完整的程序。
其次,足够的编程量是必须的,可以充分利用在线OJ系统,会给你一个正反馈,并在初始学习编程时养成严谨的习惯。
再次,为了培养同学们对编程的兴趣,我们采用了通过游戏开发来教编程的方式,可以参考:知乎专栏 。同时,C语言中的相应语法知识,如函数、数组、指针、文件等,都是在开发游戏的实践中,遇到问题,学习相应语法知识后解决问题,从而得到更深的理解和体会。
最后,有条件的话,还是和同学一起学习,这样可以互相交流、督促。后面开发较大的游戏练习时,可以进行有效的团队合作。
希望你能和我的学生一样,写代码写的来不及吃饭、来不及睡觉,经过辛勤的努力,最后拿出非常自豪的游戏作品,向同学、朋友、家人、老师进行展示。。。在这个过程中,你的C语言会提高很快的。
<a data-draft-node="block" data-draft-type="mcn-link-card" data-mcn-id="1341790035360833536">
mingren119 发表于 2023-10-14 07:57:01|来自:北京 | 显示全部楼层
如果题主没有什么编程的基础,我推荐你到这个网站:
This is CS50.这是哈佛大学的公开课《计算机科学导论》的主页,网页内容每年都会更新,现在是2014年秋季的课程内容。上面有授课老师提供的lecture notes, problem sheet, quiz,以及最重要的是附带字幕的最新课堂录像。


这个课程是用c语言来讲解的,来上课的学生也是大概一半人没接触过编程。看完这一系列视频,相信题主会对编程的方法论、计算机的一些基础知识,以及c语言都有很好的理解。
另外,真的要赞叹这个课的老师相当用心,课堂氛围也非常活跃,相信你会感兴趣的。
下面是我看课堂视频时的一些截图:


左边是老师在讲课,右边是PPT内容。


如果觉得PPT字太小,也可以把左右调换一下。


全屏也是可以的,而且老师讲课的场景会缩小到右上方。与上两张截图不同的是,这次有字幕(只需要点击右下角的“cc”)。

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则