C语言教程-写在前面
为什么开始写这个教程
首先,写这篇文章的时候,我也是一名大二的学生,但是我是从初二就开始因为兴趣开始接触c语言,中途也是起起伏伏随便学到现在的。其实因为没有师傅领进门浪费了很多时间,而且这门语言身边也没有人愿意来用,就导致我壹个人在学这门语言。
尽管我个人很喜欢C语言,但毕竟C很老了,而且有很多后起之秀,未来这门语言的形势也未曾可知,但是作为一门我的启蒙语言,我目前体会最深刻的一门语言,我想把我对这门语言的看法记录下来,融入我的这篇教程(随笔),以后再回头也能回忆起当时这门语言对我的影响之深。
本教程面向C初学者、上网闲逛的C爱好者、以及需要深入学习C语言的朋友(比如CTF比赛中的PWN,RE选手),在很多时候我写一些工具反而更愿意使用C语言。如果各位想找到浅显快速的入门教程,那么也许菜鸟教程(是一个网站名,并没有任何别的意思doge)更适合您,如果您有充足的时间和兴趣,又没有精力去认真读一些C语言的书,那么这个文章可能比较适合您对C有进一步的认识。
很多人擅长编写程序,但是不是每一个人都是一个好的阅读者(阅读他人的代码),包括我也有非常大的学习进步空间---我也刚大二(逃~),特别是一名RE手,更要在面对IDA分析出的繁杂的伪代码(C伪代码)时有着敏锐的感觉。那么,对于C语言的理解、对于程序设计思想的认识就更为重要,要从程序的目的出发,去思考代码应该是什么样的(或者说也许会被写成什么样子)。
那么我现在就想从一个摸爬滚打的计算机fw的角度来把我自己的感悟记录下来,所以也许这篇教程更像是自己的一个笔记/记录,如果有幸被各位看到,有不认同的地方还请谅解,欢迎讨论。从现在开始,这篇教程就开始编写,无所谓被多少人看到(能看到最好---谁不想自己的努力被人认可呢doge),能写多少也未知晓,虽然会花费很多时间,但是愿意做这个记录,日后回看也是好事,但愿能多写一点。
另外,由于是在博客中编写,所以请到我的博客的目录栏目中逐个点击阅读。
在文章中,有一部分内容碍于篇幅和本人的能力,没有办法完全详细的写在其中,读者可以自行查阅资料,这也算是学习的一个环节.
(以上包含了一些个人的情绪,请忽略~~~doge)
---WAHAHA,2023.9.19
学习C语言应该保持怎样的态度
(写完发现怎么写成“如何学习”教程了。。。)
对C语言应该保持怎样的(学习)态度
我相信大部分学C语言的人都是被迫的,无论是因为学校的课程,亦或是需求所迫。目前在我看来,90%学C语言的人日后工作都不会再使用这门语言。RUST,golang,python等新语言,其他新技术的出现,还有C语言自身的不可否认的一些缺陷,都让C语言这个老古董逐渐退出舞台。所以本教程适合给想要好好学C的人看。
但是其实,C语言目前还是不可或缺的(2023年),很多人都会说,我也同样要说,目前在我看来,最接近底层,最容易理解的语言,还要属C语言,C仅次于汇编的简单粗暴让C在速度,自由度上有着极大的优势,同时这也是为什么C被称为中级语言的原因。而且这些特点也和C的发展历史、开发初衷不可分割。具体可以去看《C和指针》、《C专家编程》等书。
同时由于C语言的这些特性,也让他在当今显得不再合适,更高效率的开发模式依赖新技术,我个人支持,不过C语言我仍然放不下。虽然所谓的“C语言用来系统开发”,“C语言用来写底层非常高效”这些说法确实是C的强项,Linux,UNIX等系统,一些重要程序也都是纯C编写的,但是现在的开发讲求效率,便于维护,C语言就显得比较老旧。
但是无论C的形势如何,适合用C的地方,其他语言真的是不可替代的。想要应付考试,也可以移步其他教程更为快速有效,毕竟本人还是想好好的把自己的心得记录下来,而不是简单的应付考试。
如何成为一个合格的学习者
废话一大堆,我认为学C语言最重要的一点就是“认清你的目标”,你的目标决定了你的学习方法,深入学习和快速上手是不一样的,如果您确实对C有着很大的好感,例如作为兴趣,那么欢迎来看我的文章,并欢迎讨论。如果您需要快速上手,那么也许菜鸟教程,一些视频课程应该更适合您。
同时还要“自觉主动”,学习是自己的事情,特别是认真学习C语言更是你的选择,不要想着别人应该有义务去教你,有不懂的地方,自觉查资料,自己去弄懂,C语言是一门技能,而不是一门课程,按照学一门课程的思维去学习C语言是掌握不了这门技能的。
学习不可避免要提问,“提问的艺术”是必须掌握的,无论你学什么,你都应该先认真掌握提问的艺术!!!
具体请移步↓
https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md
“提问的艺术”中,我着重要强调的一点是“保持礼貌”,别人不是你的学习工具,没有哪怕一丁点的义务去帮助你,所以,无论是面对你的学长/学弟/老师/同学/学习群友/论坛坛友/团队成员,都(TMD)放尊重点!!!(我没有自视甚高的意思)因为见过很不礼貌的人(某些学习群群友等),他最终不仅得不到任何的帮助,反而让回答者感到很不舒服,甚至会挨骂。
吾师道也,夫庸知其年之先后生于吾乎?是故无贵无贱,无长无少,道之所存,师之所存也。任何人只要有技术,都可以成为你的老师,面对有学问的人,首当其冲的就是尊重。
接下来要注意的就是,永远不要高估自己的实力,也不要过分相信自己的判断,保持谦虚求实的态度会让你进步的更加迅速。
技术方面上学习C语言的注意事项
下面是一些常见的问题,读者必须注意(除非你想在提问时被回答者骂,或者浪费大量时间甚至放弃学习C语言)
我要买一本什么书来看?
能看懂书就不要看视频,实在看不懂书再看视频,绝对不要看烂书!
看书(文档资料)学的绝对比看视频学的精(坚定),当然效率方面各位自行评判,这里本人不想挨骂...
下面的清单是推荐的各种书(2023年),这些书其实足矣↓
书籍阅读以及学习路线(清单)
-
学习电脑操作快速入门-B站视频
你需要学会:
- 学会开关机,
打开windows的各种自带软件(例如文件管理器,任务管理器) - 学会使用
QQ,微信,WPS,OFFICE(能基本的使用就行),浏览器,网易有道词典,火绒 - 学会解压文件,打包文件,了解各种常见的文件后缀名都是什么,如何使用
- 自己能够
独立安装任何市面上常见的软件并规划安装路径(这步没学会请不要开始学习编程) 非必要不要将软件装到C盘- 学会
打字,学会用鼠标(这步没学会请不要开始学习编程) - 能用电脑解决的计算机任务(手机也是计算机)就不要用手机解决
- 学会截图(这步没学会请不要开始学习编程)
- 学会截图
- 学会截图
- 提问时不要使用手机拍照(开始学习编程后请学会此步,否则请放弃学习编程)
- 学会开关机,
-
C语言简易入门书: 《啊哈!C语言》 (比较清晰易懂,实在小白可以看这本找找感觉)
-
C语言
新标准(C11)优质书: 《C语言程序设计-现代方法(第2版,修订版)》 (相对全面介绍新标准,鼓励!) -
C语言公认"圣经": 《C Primer Plus(中文第6版)》 (C99标准经典好书,十分全面,新手读起来有点难,适合当工具书)
-
查漏补缺的书: 《你必须知道的495个C语言问题》 (你几乎可以在这里找到你初学C语言遇到的所有问题)
-
C语言进阶3件套(如果你还想继续深入学习
C语言的艺术)C编程风格与思想:《C专家编程》
C语言的细枝末节与问题:《C陷阱与缺陷》
C语言的灵魂-指针:《C和指针》(大大滴好书!你不会指针?你不配说学过C语言,一点都不配,我说的)
-
学习数据结构(C语言相对熟练后,开始数据结构的学习,别问,你一个学
计算机跑不掉)实践与思想结合,深化思想: 《数据结构与算法分析(C语言描述)原书第2版》 (好书,建议看这本)
考研用的...与实际脱节...全是理论: 《数据结构(C语言版)严蔚敏著》 (为了考试而生...)
C++描述的一本书,不建议新手从头到尾看: 《数据结构、算法与应用 C++描述》 (没学C++就算了)
另外一本C++描述的书,同样不建议新手从头到尾看: 《数据结构与算法分析 C++语言描述》
看书看不进去?找一个知识清单,直接
谷歌一个知识点一个知识点地找 -
学习算法(实际上你从学习C语言的时候就开始了,
gcd()就是一个算法...)简易入门书: 《啊哈!算法》 (蛮简单的,适合入门捏)
图确实清晰: 《算法图解》 (还可以的)
各种信息学奥赛的教材都可以: 《信息学奥赛一本通》《算法训练营套装》 (别问,问就是卷疯了)
例题很多:《算法基础与在线实践》 (题可能有点难)
算法"圣经": 《算法导论》 (萌新快跑,有人推荐你直接看这个,直接骂他,我说的)
-
深入底层(如果你仍然喜欢探究原理的话...勇士!)
书如其名: 《编译原理》
手搓CPU指令集(开玩笑): 《深入理解计算机系统》 (传说中的
CSAPP)学汇编吧: 《汇编语言(第3版)王爽著》 (8086汇编经典,16位汇编其实相对x86,x64难一点,因为有
段的概念) -
转向其他语言
C++: C语言的超集,不过已经超脱于C,该语言异常地复杂(不信邪的来学学),惊人的学习成本,难以学习,慎重考虑,不过STL很香(doge)
Python: 十分方便的一门解释型语言,有大量第三方库,十分好用(学计算机的还是学学吧,绝对不吃亏)
Java: 貌似主要是web库蛮好的...不太了解...
RUST: 新语言,目前生态不完善,有待观望
Golang: 不知道...
对上面的一些解释:
-
上面的列举更多的是
清单,而不是路线,书名前是书籍的客观描述(出于个人,不喜勿喷),书名后括号是个人的态度(出于个人,不喜勿喷),各个方向的书中选择适合自己的,可以几本书结合起来,取长补短. -
电脑操作十分重要,一定要学会!
-
各位往往从C语言入门,而不再深入,适时转向其他语言这很正常.不过底层知识作为计算机er还是十分重要的.
-
算法这一概念十分广泛,小到
最大公因数求解,大到机器学习,也有着十分庞大的分支.学习数据结构的时候往往逃脱不开对应的算法,换言之,算法和数据结构密不可分,包括实际的代码实现,请不要将其视为三个不相干的板块. -
注意:大名鼎鼎的"谭浩强C语言"(红书),对书不对人,谭老的这本书虽然经典,但是放在现在(2023年)有点过时了,而且这本书的习题集真的别做,很多都是错误的.不过这本书的第五版更新了,感觉还可以. -
不要看任何听都没听过的书!常常为《XX语言程序设计》等.书中有问题你就被坑惨了.
我的代码为什么跑不通了?软件问题?
作为C语言的学习者,你不可避免的会遇到很多看似正确,实则错误的写法,这也许怪不得你,因为C语言如此精简使得很多不经意的修改并不会导致语法上的错误,甚至在逻辑结果上在小范围内都不会有任何问题。所以,如果你发现你的程序换一个输入或者做了一个小修改,结果就不对了,请首先不要质疑你的编译器/IDE/操作系统等等---他们一般情况下比你高明多了,先去考虑自己的代码哪里有问题。
我的软件怎么配置不好?
初学,不要纠结任何软件问题,不要去考验自己,我本人是极其不建议新手去使用VSCode等需要高度自定义的软件的(并没有批评VSCode的意思),一句话:“先让程序跑起来,能跑就行”.后面会有专门的篇章进行讲解软件的选择和安装.
好多重点,我要不要记笔记?
学习C语言过程中,个人建议不要用任何笔记软件做哪怕任何笔记(ASCII码表等硬性知识除外),因为这样效率太低了!
请学习一点知识,打开你的编辑器,写一个特定功能的程序,把你的笔记作为这个程序的注释放进去,存好这个程序,这才是实打实的东西!!!
当然,如果您想要做博客总结,当然十分好,这里建议使用Typora+Hexo框架来做笔记发博客。
没电脑,其他设备可以用吗?
可以,如果你实在没电脑的话,用手机平板都是可以的,这时候就别想着这些平台的编译器能有多好用,能跑就行.
所以,有条件的话还是要配一台电脑的,哪怕是十年前的烂电脑都行.
学习技巧
我需要从哪里寻找资料?
使用搜索引擎
首先,利用好搜索引擎,这里的搜索引擎主要是Bing,google这两个,所谓的中文必应,英文谷歌,在这里不建议用百度.
别问,问就是学计算机的没人用百度去搜索,什么都搜不到...
我们来尝试搜索一下ebp寄存器来做个对比:
我们来看一下前几条结果...
1.百度给了个百度百科,给了一篇csdn博客,然后就是b站视频...
2.必应给一篇文章突出显示,然后后面全是相关文章...
- 谷歌搜索出来的全是相关文章...
很显然...百度搜出来的都是什么玩意...所以,我们一定要学会用必应或者谷歌去查找资料!
而且,如果你在中文网站找不到满意的资料,不妨试试看国外的文章,相信你很有可能会找到满意的答案!
利用好一些网站
学习C语言,我还真没有用过什么网站,这里想说的就是,如果你找到了一些比较好的网站,请多去翻翻看,也许就能找到答案.
而且,有一些公认的程序员必备网站,我们应该多加利用:
1.GitHub
开发者极其重要的网站:https://github.com
这个网站上面有大量的资源,许多开发者都将自己的代码托管在上面,我们可以在上面找到不计其数的工具,项目等,只有你想不到,没有他没有的东西.
同时,这个网站不仅仅是C语言,只要你从事计算机行业,这个网站你绝对逃不掉!而且,许多学生认证也看的是这个平台!
2.B站
国内的许多好视频教程都在这上面有发布,许多免费课都有,如果你需要短时间了解一门技术,不妨来B站试试看.
3.Stack Overflow
Stack Overflow — 解决 bug 的社区:https://stackoverflow.com/
这是一个非常专业的交流平台,不同于博客网站,上面的大量问题都是有着非常专业的回答,如果有能力,一定要多在这上面寻求帮助.
4.csdn
说实话...这个网站现在有点废...因为任何人随便发几句随笔,就能当做博客丢上去了,就导致csdn上面的信息良莠不齐,如果是临时查找一些简单的知识,可以来csdn找找,更专业的知识...最好去博客园等网站看看.
而且好多都收费...没钱...
5.cppreference
中文网站:https://zh.cppreference.com/mwiki/index.php?title=首页&variant=zh-cn
这可是标准文档啊!标准文档!这上面是非常权威的解释!
如果你在和某人讨论一些语法概念的细节,不如直接拿标准说话!
"你说的听起来没毛病,但是标准是这么说的吗?如果不是,那你就是错的!"
并没有什么所谓"不要挑战权威"的意思,我们是学习编程,学的是别人创造出来的技术,不是你在开发技术,有什么疑问,那么这么语言的开发维护者有绝对的话语权!
6.微软MSDN
也许你在学习VS怎么使用,或者你在学习Win32API,请查询微软官方的在线文档.
https://learn.microsoft.com/zh-cn/docs/
多听建议
相信大部分人都有厉害的学长学姐(还有同辈,学弟学妹)...多去问问他们...你会有收获的doge
也许我需要一些前置知识?
学会使用电脑
(参见前面的书籍清单以及...)
虽然这个标题听起来有点搞笑,但是事实就是如此---不是每个开始学C语言的人都能流畅的使用电脑(包括各种技巧).
但是,我必须指出的是,如果你能轻松的使用电脑,甚至多少了解一些计算机(电脑)的基本原理,那么你学习C语言入门会轻松的起飞!
因为,学习编程,某种程度上就是在学习如何从计算机的角度去考虑如何解决一个问题!
各位如果确实欠缺这方面的知识(例如从来没用过电脑),可以去买一本大学计算机基础的书,简单补一下知识...
或者,至少你应该知道如何在Windows操作系统下正常安装各种软件,使用QQ进行聊天,学会使用电脑的截图,记住常用的Windows快捷键等等,如何使用电脑浏览器去搜索资源并下载...
基础数学
1+1=2是不够的...
虽然不要求你在学C之前必须掌握如何求解一元二次方程...但是我们学习C语言的一个最简单的用途就是求解数学方程...那么你如果连方程是什么都不知道...那么...你懂...
想要学好C语言,至少要有高中的数学知识---不会就学,有些地方的初中比一些高中还nb...不要求你能流畅做出高考导数题,起码要知道导数是啥.
绝对值,开方,三角函数这些要知道吧...都是基础.
另外,像素数判断,最大公因数,最小公倍数的求法等最基本的数学算法,你也应该掌握---至少掌握一种求法.
如果这些没问题了,我们C语言用来解决数学问题的时候,当然需要你知道这些数学问题,比如基本的线性代数,我们要写一个矩阵求逆的算法,你需要知道矩阵是什么,如何求逆.
等等...
当然,并不是说学了C语言就一定要去编写这些东西,但是有一点能保证的是,有实力的程序员对这些都是非常熟练的.总之,数学知识可以不够,但是至少你的数学思维多少要到位!
学英语
这个没的说,许多网站都是英文的,虽然我们有翻译软件,但是毕竟翻译出来的专业名词和原文还是有差异的,最好要差不多能读懂一些英文的文章.
但是,学编程和英语真的没啥关系...尽管我们使用英文字符去编码...你看到的代码中那一堆所谓的"英文",其实大部分都是起的变量名而已,找个词典一查,复制粘贴出来就行...
写代码的时候
不要手写!
敲代码->可以调试,手写代码->肉眼生盯
注意代码格式规范,养成较好的代码规范更有助于理解代码.
写注释!如果一段代码比较复杂/比较重要,请写注释!
别的需要的我暂时想不到了...想到了再补充...
约定和注意事项
本教程的问题
本教程的问题很明显,前后可能不太连贯,很多知识会"放到后面讲",出现这个问题的原因是笔者想将各个概念讲好,而不是一带而过.
另外,教程可能不会包含一些非常简单的,在书上就能找到的东西---例如一些基本的计算机常识---你应该同时找一本书作为参考或者多去搜索!
可能存在的超前的内容
因为本书主要从讲解思路作为切入点,所以一些代码片段可能还没有讲解,就放进来作为示例了.
所以本教程默认各位连着看下来,同时有较强的搜索能力和理解能力---实际上就是希望大家尽量学会去猜---猜代码的用途,你可能并不需要把某一行代码彻底理解,只要猜出来结果是干什么的就行.
例如:笔者会直接引入输入输出的两个函数---scanf()和printf(),此时,你应该做到无需关心这两个函数的原理和写法,如果我们有:
int a;
scanf("%d",&a);
读者应该只需要意识到这段代码用于给a输入一个整数,而无需关心这行代码的各个部分到底是为什么这么写.
同理,如果我们有:
int a = 3;
printf("%d",a);
读者应该只需要意识到这段代码用于输出a的值,也就是3,而无需关心这行代码的各个部分到底是为什么这么写.
同时,int a=3;读者可能不知道int是干什么的,但是看到a=3就应该意识到:总之这行代码就是让一个变量a的值为3.
其他同理,学习要学会去适当合理的猜测.
另外,所有"超前"的内容,后面一定会讲到!
那么,讲到现在,也算是发了一点牢骚---因为踩过坑,不想让其他人再踩.之后就正式开始写教程.
---WAHAHA,2023.9.27
下一篇:c语言教程-1-什么是程序

浙公网安备 33010602011771号