累够呛!整理了一份C 学习路线图!
扫描二维码
随时随地手机看文章
直接看图:高清图片,请添加程序喵微信获取
图中我分了11个板块:
- C语言入门基础知识
- C 基础
- C 进阶
- C 新特性
- 操作系统
- 编译链接
- C 项目
- 推荐工具
- 编码规范
- 推荐网站
- 推荐书籍
具体如下:
C语言入门基础知识使用C 不可避免的需要用到C语言,所以C语言的基础知识我们也需要了解,主要有:
- 数据类型
- 流程控制
- 函数
- 指针
- 内存布局
- 结构体、共用体
- 文件操作
- 回调函数
C 基础这里整理了一些C 必须要知道的基础知识,主要有:
- constexpr
- namespace
- 引用与指针的区别
- new/delete、new[]/delete[]
- C/C 混合编程
- 类的封装
- class与struct的区别
- 面向对象编程思想
- 构造和析构
- 拷贝构造、移动构造
- 赋值构造、移动赋值
- 四种强制类型转换
- 静态成员
- 对象管理
- 函数重载
- 友元函数与友元类
- 操作符重载
- 继承与多继承
- 多态
- 虚函数与抽象类
- 函数模板与类模板
- 输入输出类
- 异常处理
C 进阶我把下面的一些知识归为进阶知识点,可能你学完了也没进阶到哪里去,但是也是进阶必备知识点,主要有:
- new/delete、new[]/delete[]为什么要配对使用
- RAII特性
- 智能指针
- 内存泄漏的调试
- STL♦️ vector
- resize
- reserve
- capacity
- clear
- swap
- at
C 新特性现在C 开发基本上都会使用C 11,而且C 新特性在面试时也是面试官常问的知识点,这里我总结了一些必须要知道的C 新特性:
- auto/decltype
- 列表初始化
- 左值、右值、左值引用、右值引用
- 移动语义、完美转发
- std::function、std::bind
- lambda表达式
- std::thread
- std::lock_guard、std::unique_lock
- std::shared_ptr、std::unique_ptr
- std::mutex
- 原子操作
- enum class
- 条件变量
- nullptr
- chrono
操作系统操作系统非常重要,要学好C 就一定要打好操作系统的基础,但操作系统我们也没必要全都钻到细节里去,重点攻克下面几个知识点即可:
- 进程与线程的区别
- 进程管理与调度
- 内存管理
- 并发与同步
- 文件I/O
工具这里推荐下我在开发过程中经常会用到的几个工具:
- 调试工具:gdb、lldb
- 构建工具:Cmake、bazel
- 静态代码检测工具:cppcheck、Clang-Tidy、SonarQube
- 内存检测工具:valgrind、ASan
- profiling工具:gperftools、perf
编码规范使用一门语言一定要了解一下它常用的编码规范,有了编码规范代码写的才能稍微漂亮一点,目前多数C 开发团队都会参考Google编码规范来写代码。
编译链接知识点学习C 一定要了解一些编译和链接的知识,如何连一些常见的编译链接错误都解决不了,那怎么能是个合格的C 程序员呢?
- 预处理、编译、汇编、链接
- 静态链接
- 动态链接
- Debug与Release的区别
C 项目光学开车不行,你得上路;光学理论知识不行,得实践呀!
可能普通学生不知道做个什么项目?我有个想法,可不可以做这样一个小东西,输入是一段人物视频,输出也是一段视频,但是输出的视频中会对人物做一些特效处理,比如画一个人脸框,添加一些字幕,贴一个动画贴纸,贴个滤镜等。
在撸项目的过程中,应该会遇到很多问题:
- 如何解码视频?是不是要引入个第三方库?怎么才能在工程中接入第三方库?如何编译,如何链接?
- 如果编码视频?是不是又要引入个第三方库?
- 如何画一个人脸框?是不是需要先识别到人脸?怎么识别人脸?是不是要引入三方人脸识别库?
- 如何添加字幕?如何添加动画?如何贴个滤镜呢?链接个ffmpeg?
你还会遇到一些问题:
如何制定这个项目的编码规范呢?使用什么编码风格,你可能需要Google编码规范。项目最好统一使用C 11新特性,可以看这个:《c 11新特性,所有知识点都在这了!》
如何设计这个项目的架构呢?这是个技术活,也是个经验活,你可以参考参考别的项目?或者自底向下,走一步看一步,哪个模块的代码写完后看着不顺眼了重构一波,一般我看自己两个月前写的那些代码都会感到别扭,这时就可以考虑考虑学习一波设计模式!
项目的功能越来越多,逻辑越来越复杂,bug会越来越多,如何调试这些代码?你可能需要看看这个:《我是怎么调试代码的?》
项目功能很多,这时你会接触到多线程,同步,死锁等概念,如何设计多线程,使用线程池吗?如何做好同步,解决数据竞争问题,是使用原子操作,还是使用互斥锁等。使用锁的过程中如何避免死锁,如果出现了死锁怎么定位呢?C 线程池的实现之格式修订版
功能增多,性能肯定越来越差,如何做好性能优化,如何更好的管理内存?使用什么工具来做性能分析呢?可能需要看看这个《这么多性能调优工具,看看你知道几个?》
相信撸完这个项目后,你的C 也可以算作入门了吧!
再推荐几个我常用的网站:
- https://cppinsights.io/
- https://godbolt.org/
- http://www.sunistudio.com/cppfaq/
再推荐基本个人认为比较优质的书籍:
- 《C Primer Plus》
- 《Effective C 》
- 《Effective STL》
- 《Effective Modern C 》
- 《STL源码剖析》
- 《深入理解计算机系统》
- 《现代操作系统》
再引用在一个论坛中看到的C 学习路线,看着蛮有道理推荐给大家:我提供一条线吧,针对C/C 以及针对LINUX后端服务器开发和分布式系统开发这条线:0. 斯坦福的《编程范式》课程百度一下很多资源1.《c primer》1个月刷完第一遍做课后习题答案看《C primer习题集》2.《EffectiveC 》1个月刷完第一遍3.(可选)《CSAPP》的Tinyweb浏览器实验(这个其实更多是C但是还是建议做一下原因后面说)(1个月)4.跟MIT68242012年spring的分布式系统课程做完它的lab学习其代码课程主页:https://pdoscsailmitedu/archive/6824-2012/indexhtml(2个半月)4a. (可选)抛弃lab中助教提供的框架代码自己实现一套完整的tinydistributedfilesystem(2个月)5. 陈硕大牛的《Linux多线程服务端编程使用muduoC 网络库》刷书 练习认认真真的分析学习muduo网络库(2个月)6. 第3、第4、第5步中遇到的问题去针对性看《C primer》和《EffectiveC 》中相对应的章节7. 学习过程中好好利用GOOGLE、STACKOVERFLOW好啦到这里大概C 理论算入门再往深一点点的水平也有一定的C 的代码量啦个人感觉刷刷题找工作也没啥问题了大概的时间列出来了好好评估下吧说一句哈真要走C 这条线的话就别把自己局限到C 中啦也把C给学啦看看《APUE》、K