干货 | 如何系统学习 C 语言?

article/2025/10/6 0:56:31

关注、星标公众号,直达精彩内容

  • C 语言应该是绝大部分同学的编程第一课。

  • 对于非 CS 专业的同学,学 C 语言主要是掌握一些基本的编程方法,C 语言只是媒介。

  • 但是对于 CS 科班的同学,C 语言是后续的计组、体系结构、操作系统、编译原理等课程的基石,对于 C 语言本身甚至程序设计语言基础原理的深入理解都是应该掌握的。

一、一图胜千言

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

二、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 语言学习之路就到这里了,其实还有很多东西没提,比如 Linux C 方向的。

主要为了突出学习 C 语言本身,不想喧宾夺主,让大家迷失了方向。

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

这一套学完,C 语言基本问题不大。

有需要的可以点击下方公众号,关注后回复「C语言」即可。

祝大家周末愉快~~


http://chatgpt.dhexx.cn/article/p58LBPHg.shtml

相关文章

探索学习C语言的方法

大一入学以来到现在其实自己现在仍然还是没有找到一个学习C语言的方法 &#xff0c;现在仍然还处于一个对学习方法的探索阶段&#xff0c;那就浅浅的分享一下自己之前所用过的方法吧&#xff0c;以下是我自己总结的有C语言的知识点,希望能有大神指教 浅浅的分享一下学习方法。…

论初学者对c语言的理解与学习方法

最为一名刚刚上大一学习C语言的小白来说&#xff0c;是不是有很多人像我一样&#xff0c;上第一节C语言课程的时候&#xff0c;一脸问号&#xff1a;“这是什么东西”&#xff0c;“我学这个东西干什么”&#xff0c;“老师在前面说的是啥&#xff0c;我怎么什么都听不懂&#…

C语言学习方法、学习平台及项目推荐

2022 精心整理的 C语言/C++ 语言学习宝藏,值得收藏~_程序员编程指南的博客-CSDN博客知名大学计算机系开源课程收录:浙江大学课程攻略共享计划清华大学计算机系课程攻略上海交通大学课程资料分享北京航空航天大学(北航)课程作业资料共享计划华北电力大学计算机系课程攻略北京邮…

C语言最新学习路线(从入门到实战)

C语言学习路线 关于C语言的学习路线小编给大家画了一些思维导图&#xff0c;希望能够帮助到大家 工具篇 目前Windows环境下的开发工具已经更新完毕&#xff0c;大家可以查看对应的文章 使用VScode开发C语言程序&#xff0c;环境安装配置&#xff0c;保姆级教程使用VS2019编写…

如何学好C语言程序设计?

大一新生&#xff0c;或者想进入IT行业的人士&#xff0c;学习的第一门计算机编程语言往往是&#xff1a;C语言程序设计。 提到C语言&#xff0c;有同学立刻会向我提一串问题&#xff1a;怎么编程老出错啊&#xff1f;明明编译过了&#xff0c;怎么运行结果不正确?想编写一个大…

C语言超全学习路线(少走弯路)

学完 C 语言&#xff0c;有助于我们对其他语言的理解&#xff0c;毕竟 C 语言比较低鞥&#xff0c;如果你还是大一大二&#xff0c;不知道该使用哪一门入门&#xff0c;那么我推荐C语言&#xff0c;可能比Python等难&#xff0c;但掌握之后学其他语言会容易很多。 下面是我学完…

必看:C语言高效学习方法(附经典试题详解)

C试题100例详解 写在前面C语言高效学习方法 正片开始&#xff1a;问题描述课题分析算法描述自然语言方式描述流程图方式描述 源代码试验结果分析与讨论 写在前面 本专栏提供多于100道C试题解答&#xff0c;并且会一直不定期更新&#xff0c;使用的过程中如果有看不懂的地方&am…

分享下自己学习C语言的方法和心得!

要如何学好C语言&#xff0c;其实最核心的就一点&#xff0c;自己得多去练习写代码&#xff0c;有些东西&#xff0c;练习的多了&#xff0c;自然就懂了。如果只是一味的看书&#xff0c;看视频教程而不是自己动手去实践&#xff0c;去敲代码&#xff0c;调试运行&#xff0c;那…

C语言 学习

其中&#xff0c;#include 预处理器指令 int main(void) main()总是第一个被调用的函数 C语言有6种语句&#xff0c;标号语句&#xff0c;复合语句&#xff0c;表达式语句&#xff0c;选择语句&#xff0c;迭代语句&#xff0c;跳转语句。 圆括号表明main()是一个函…

C语言学习

C语言简要概述 简单来说一个C程序就是由若干头文件和函数组成。 简单示例&#xff1a; #include <stdio.h>//头文件 int main() //主函数 { printf("I love C"); return 0;} 一个C程序&#xff0c;有且只有一个主函数&#xff0c;即main函数,C程序就是执行主…

我是如何自学C语言的(一个菜鸟的学习路)

零基础扫盲课&#xff1a; 计算机科学速成课&#xff08;扫盲课&#xff09;:【计算机科学速成课】[40集全/精校] - Crash Course Computer Science_哔哩哔哩_bilibili 简介&#xff1a;这个视频会以自下而上的方式&#xff0c;给你介绍整体计算机行业的各项知识&…

c语言学习方法论

简介&#xff1a;给大家介绍一下C语言的知识结构&#xff0c;让大家呢在学习C语言之前呢对我们这个 C语言的整体的知识模块有一个整体性的认识&#xff0c;你学的是什么你知道&#xff0c;那么你学的这个进度在你这个了解C语言的这个知识结构的基础上呢也会有一个很好的把握&am…

大一新生应该如何学习C语言,书上代码看不懂理解不了怎么办?

大家好&#xff0c;我是二哥呀&#xff01; 昨天有个读者问我要 C语言的学习路线&#xff0c;他今年刚上大一&#xff0c;书上的代码完全看不懂。 讲真&#xff0c;大一新生&#xff0c;一般都是零基础的纯小白&#xff0c;看不懂书上的代码很正常&#xff0c;除非是小学、初中…

如何学习C语言

目录 写这篇文章是给刚迈入我们c语言的小萌新的一些建议&#xff0c;因为掌握了好的方法&#xff0c;我们学习起来才能事半功倍&#xff01; 一.了解C语言 二.每天看C语言方面的书 三.每天多敲多练 四&#xff0c;找到独属于自己的学习方法 五.培养自己对于编程的学习兴趣…

浅谈WebService技术以及实现相关的REST和SOAP

前言&#xff1a;今天工作用到了REST接口&#xff0c;网上查找发现了许多写REST和SOAP的文章&#xff0c;所以又联想到了前段时间刚用过的WebService技术就是用SOAP实现的&#xff0c;然后就花了些时间搞了一下WebService原理以及REST和SOAP的区别。 WebService实现原理: 一、…

WebService重学(自用)

乱花渐欲迷人眼&#xff0c;浅草才能没马蹄&#xff01; 接触一个新技术的时候&#xff0c;脑海中总是会跳出这句诗。附庸风雅&#xff0c;非我本意。主要还是因为很多网络学习资料&#xff0c;把简单的东西搞得很复杂&#xff1b;该有内涵的时候&#xff0c;又俗不可耐。 前段…

WebService

webService报错总结&#xff01;&#xff01;&#xff01; Unmarshalling Error: null 原因&#xff1a;接收的参数实体类中的字段类型是BigDecimal&#xff0c;参数中传的字段类型是VARCHAR2(300) Unmarshalling Error: Date类型的字段不能传空。 1、标题学习目标 2、webs…

javaWebService技术框架

0.WebService交互方式和浏览器交互方式对比 1.WebService对内的意义&#xff1a;架构 2.WebService对外的意义&#xff1a;提供第三方接口支持 3.Java中的WebService标准 ①JAX-WS标准 数据传输格式&#xff1a;SOAP 服务器端自描述语言&#xff1a;WSD…

Java WebService

1、WebService简介 Web Service技术&#xff0c; 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件&#xff0c; 就可相互交换数据或集成。依据Web Service规范实施的应用之间&#xff0c; 无论它们所使用的语言、 平台或内部协议是什么&#xff0…

Java开发中经常使用到的几种WebService技术实现方案

Java开发中经常使用到的几种WebService技术实现方案 随着异构系统互联需求的不断增加&#xff0c;WebService的重要性也日益彰显出来。凭借webservice&#xff0c;我们可以实现基于不同程序语言的项目的互联互通。更可以将开发好的程序接口以服务的形式发布出去供使用者调用。w…