学习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;
};
// 创建链表
【学习C语言的初步路线】#define LIST_HEAD_INIT(name) { }
// 运行时初始化链表
#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(
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”挺火 , 没试过 。
- 系统性学习Node.js(5)—手写 fs 核心方法
- C语言开发环境
- TIOBE8月编程语言排行榜:C语言蝉联第一,R语言成黑马
- 使用半监督学习从研究到产品化的3个教训
- Rust语言学习:Beginning_Rust
- 如何编写JAVA小白第一个程序
- 不需要负样本对的SOTA的自监督学习方法:BYOL
- Linux培训完能到什么水平,之后还需要学习哪些技术?
- Go语言最酷的一些东西
- 向蚂蚁学习“跳一跳”战略,持续打磨公文写作核心竞争力