这套 C 语言视频课一共 144 讲,讲法是”从硬件那一侧往上看软件”。不少教程一上来就带你打印 Hello World,然后背语法,背完还是不知道指针到底在干嘛。这门课的起点不一样:第 1 讲先把课程大纲和上位机开发的学习路线铺开,第 2 讲聊聊人工智能与自动化设备开发是怎么回事,第 3 讲装上 VS2022 跑通第一个程序,第 4 讲讨论 C# 的语言生态,第 5 讲用 C 写一个控制台程序做对比。先把坐标系建好,再往下走。
接下来这段是很多人会跳过的,但恰恰决定了后面能不能学通。第 6 讲讲编译原理,讲操作系统是怎么把一个程序从磁盘拉进内存跑起来的;第 7 讲用反复调试同一个程序的办法,让你亲眼看到变量在内存里是怎么摆放的。这一段听懂了,后面打开调试器的内存窗口才不会发懵,那一串十六进制数你才知道对应的是什么。

第 34 讲往下的二进制、十六进制、符号位、变量溢出,不是照着 PPT 念结论。课程用 sizeof 配合循环,把 1 到 8 个字节的整型取值范围一个个算出来,算完你就明白为什么 char 是 -128 到 127、为什么 255 再加 1 会变成 0。第 37 讲通过写循环程序求 64 位整型的最大值,第 39 讲把 sizeof 和二进制、十进制的转换算法放在一起讲,第 41 讲还用位运算反复优化同一个程序的执行效率。运算符优先级、ASCII 表、转义字符,以及 printf 和 scanf 的各种控制符集中放在第 50 到 58 讲,第 52 讲专门解释 scanf 为什么不安全、scanf_s 该怎么用,第 54 讲把回车和换行的区别讲透——这些是后面写代码时每天都要查的东西,早点搞熟省事。
数组和字符串这一块几乎全是动手题。第 62 讲用 sizeof 和 _countof 求数组元素个数,第 63 讲演示数组越界访问内存的严重 bug,第 64 到 67 讲连着做四道算法题:求最大值最小值、多种方法实现反序、元素查找、排列组合里搜索相同的对数。第 68 讲讲用和差算法等几种办法交换变量,第 69 讲通过反复测试来理解随机数和时间函数。第 72、73 讲是两个经典 bug 分析——strcpy 和 strcat 调用时数组越界之后内存里到底发生了什么;讲这个不是让你记住”要用 strncpy”,而是让你看到越界写坏的是哪块地址。
函数从第 74 讲展开。第 76 讲用九次改写,一步步完善和优化 strcpy 函数的实现原理;第 77 讲用最简易高效的方式实现 strcat;第 78 讲演示数组做形参时的经典 bug 和解决方案。第 79、80 讲深入拆解 strcmp 的比较条件与算法优化,第 81 讲通过反复测试剖析冒泡排序的过程。后面延伸到多源文件的工程管理,以及编译和连接这两个动作到底做了什么。
指针是这门课花时间最多的部分,第 83 到 94 讲几乎每一节都开着内存监视器在讲。第 83 讲用内存观测器引入指针变量的概念与定义,第 84 讲演示通过指针遥控内存里的变量改变数值,第 85 讲用三种 swap 函数对比指针做参数对实参的不同影响,第 86 讲看指针做参数对数组变量的影响,第 87 讲利用指针偏移实现高级内存操作,第 89、90 讲梳理不同类型指针操作内存时的长度、以及指针升降级符号之间的等价关系。第 91 到 94 讲用指针法重写 strcpy,并把 strchr、strpbrk 的原理和指针减法计算一起实现一遍。全部落在地址和字节的层面上,能一条一条对上号。

指针这一段啃下来,结构体、内存四区、malloc 与 free 就顺理成章了。第 95 到 97 讲讲结构体的概念、定义和成员调用,以及 typedef 与 struct 的复杂定义方式;第 98 讲开始用结构体数组做信息管理,第 99 到 101 讲通过内存监视观察结构体对象、结构体指针做形参时对实参的影响。第 102、103 讲从编译原理和程序加载原理出发,把栈区、堆区、全局区、代码区这四块内存分清楚。第 105 讲顺带讲了匈牙利命名法和大小驼峰命名法,第 108 到 111 讲跨文件工程怎么组织、编译与连接在其中扮演什么角色。
后半段是三个能拿得出手的项目,而且是用同一个需求反复重写。第 98 讲先用结构体数组做一版信息管理,固定容量、下标访问、新增修改删除、多列排序;第 112、113 讲把界面和算法拆成业务层与算法层两层,工程结构第一次成形;第 114 到 120 讲补上动态数组的节点删除算法、fopen 与 fread/fwrite 文件读写、项目数据存取、二级菜单选择排序方式、自定义头文件,以及多列数据排序功能;第 121 到 126 讲正式换成 malloc 动态内存分配,容量按需增长,把动态数组项目的架构设计、文件加载、数据修改、多列排序完整实现一遍;第 131 到 138 讲再升级成单向链表,头插法与尾插法、软件架构分析、数据的保存加载、修改删除,以及选择排序在链表上的实现。四个版本功能一模一样,差别只在底层的数据结构——这才是这门课最值钱的地方。数据统一用 fopen、fread、fwrite 存在本地文件里,程序下次启动自动加载回来。

最后收在上班最常踩坑的语法上。第 127 讲到 130 讲讲预定义语句与宏函数、#if 条件编译的各种应用场景与系统内置宏,以及 const、define、enum 三种常量定义的语法区别;第 139 讲 union 共用体;第 140 讲结构体字节对齐的问题与设置方法,这一条在和硬件寄存器打交道时特别重要;第 141 到 144 讲二维数组的定义与调用、三种方法实现随机浮点数生成、RAND_MAX 与 0 到 1 之间小数的生成原理,以及二维数组的横向纵向统计功能开发;第 145 讲顺带把 C 与标准 C++ 的概念和区别讲清楚,方便你判断下一步该往哪走。
这套课适合谁来学:想转嵌入式或者上位机开发、但 C 基础一直不牢的;电子、自动化、机电专业还在读书的;工作里要读别人写的驱动代码、经常被指针和结构体绕晕的。学之前不用会编程,能装软件、能坐得住就行。建议从第 1 讲顺着往下看,每讲的代码自己敲一遍再走下一讲,比倍速刷完有用得多。
视频已经按课时编号排好,也可以直接在下面的目录里点着跳。
课程目录(按课时顺序)











