如何学习 C 语言?

[Copy link]
see4542 | reply19 | 2022-1-9 19:18:52 | 显示全部楼层 |Reading mode
有一句说的特别对“C生万物,编程之本”!C语言在计算机体系占据着不可替代的位置!



如果你不知道如何学习C语言,那么,跟着下面的学习路线图来学吧,附带学习视频哦!


C语言配套学习视频:
1小时透彻理解C语言指针

完整视频:
配套资料:https://pan.baidu.com/s/14bnf2W2RPbgz-k6Fw9rm7g   提取码:2vk4
C语言提高深入浅出

完整视频:
配套资料:https://pan.baidu.com/s/1jhJplSj4-ZPzSecz1elr4A 密码:ov17
C语言数据结构 培养架构师思维

完整视频:
配套资料:https://pan.baidu.com/s/1C4cm3tVmR0Wea9q6ut-xYQ 密码:4wi6
最适合自学的C++基础视频_深入浅出版全套资料

完整视频:
配套资料:https://pan.baidu.com/s/1brlk0Ab 密码:n66u
匠心之作 C++from0reach1入门学编程

完整视频:
配套资料:链接:https://pan.baidu.com/s/1PbkG54Pcrmlof-61Sl8fPg 提取码:q0i4
使用策略模式实现游戏技能系统

完整视频:
配套资料:https://pan.baidu.com/s/1hrtys59uDd7aROyv3p1E9A 提取码:mpxa
linux典藏系列之 网络编程

完整视频:
配套资料:https://pan.baidu.com/s/1pNonADaGLktICkpeqTUCCQ 密码:yfyy
C++核心编程 打造你的核心编程技能

完整视频:
配套资料:https://pan.baidu.com/s/1F_tvZX3h6MrlCl3U6RUJtA 密码:cka8
C++关系型数据库编程 | 4天从入门到精通

完整视频:
配套资料:https://pan.baidu.com/s/1YETuEInQMzuhcpYpns4Xjg 提取码:i1qk
C++ STL 高级教程 | 深入浅出版

完整视频:
配套资料:https://pan.baidu.com/s/1sli_-2F9IENir1ZeLjXRMQ 密码:cj6j
步步打造-frameQT自定义界面

完整视频:
配套资料:https://pan.baidu.com/s/1QpFmOEV6QgfJoMd3KsD0Pg  提取码:y4a8
QT从入门到实战完整版

完整视频:
配套资料:https://pan.baidu.com/s/1o2MzfY-Z_5jUj5ym8BXcAg 提取码:xapf
MongoDB从配置到编程

完整视频:
配套资料:https://pan.baidu.com/s/13rHVy53uCNZuAumik2ojrQ 密码:8d5k
学好linux? 从零基础系统编程开始
完整视频:
配套资料:https://pan.baidu.com/s/17E_5UIK_naKCbSIy7IHVfg 密码:3l77
半小时快速搭建网络攻防环境-Kali操作系统

完整视频:
配套资料:https://pan.baidu.com/s/1yLqeSZ9_zcvc0HXCzfHTFA 密码:49ds
C++与分布式数据库开发

资料:http://pan.baidu.com/s/1o7SwLrs 密码:2g5t
c++与安全协议开发

完整视频:
配套资料:http://pan.baidu.com/s/1pLDOmXd 密码:wyp6
C生万物之游戏内存劫持

完整视频:
配套资料:https://pan.baidu.com/s/1BYDSXZurz2FSIpnpAaWOXw 提取码:9bzr
金山游侠开发

完整视频:
资料:http://pan.baidu.com/s/1nuFD7o1 密码:sabw
C++干大事系列之游戏篇:Qt飞机大战

完整视频:
配套资料:https://pan.baidu.com/s/11XD9Mabj9IouaWwNj_0-SA 提取码:9zuz
QT跨平台小游戏开发—黑白棋

完整视频:
配套资料:https://pan.baidu.com/s/1oA4skNRKcpdtIGdg7nKrwQ  提取码:e2wa
【毕设项目】使用QT实现跨平台开发“快播‘播放器

完整视频:
配套资料:https://pan.baidu.com/s/1dYy_wkuOX5MDI0jbvSNcLg 密码:wylm

moreC++学习教程

There are more resources in this post

What do you need Sign in Can I download or view it without an account?Join now Scan and login on wechat

x
Translated by the Internet, your translation resource information platform, pay attention to the official account [translation information]-Official account:fanyi899
丁香如雨捌 | 2022-1-9 19:19:48 | 显示全部楼层
有一句说的特别对“C生万物,编程之本”!C语言在计算机体系占据着不可替代的位置!



如果你不知道如何学习C语言,那么,跟着下面的学习路线图来学吧,附带学习视频哦!


C语言配套学习视频:
1小时透彻理解C语言指针

完整视频:
指针如此简单--1小时透彻理解C语言指针配套资料:https://pan.baidu.com/s/14bnf2W2RPbgz-k6Fw9rm7g   提取码:2vk4
C语言提高深入浅出

完整视频:
C语言提高深入浅出配套资料:https://pan.baidu.com/s/1jhJplSj4-ZPzSecz1elr4A 密码:ov17
C语言数据结构 培养架构师思维

完整视频:
C语言数据结构 培养架构师思维配套资料:https://pan.baidu.com/s/1C4cm3tVmR0Wea9q6ut-xYQ 密码:4wi6
最适合自学的C++基础视频_深入浅出版全套资料

完整视频:
C++教程_C++教程视频_C++教程下载配套资料:https://pan.baidu.com/s/1brlk0Ab 密码:n66u
匠心之作 C++from0reach1入门学编程

完整视频:
C++| 匠心之作 from0reach1入门学编程配套资料:链接:https://pan.baidu.com/s/1PbkG54Pcrmlof-61Sl8fPg 提取码:q0i4
使用策略模式实现游戏技能系统

完整视频:
使用策略模式实现游戏技能系统配套资料:https://pan.baidu.com/s/1hrtys59uDd7aROyv3p1E9A 提取码:mpxa
linux典藏系列之 网络编程

完整视频:
linux典藏系列之 网络编程配套资料:https://pan.baidu.com/s/1pNonADaGLktICkpeqTUCCQ 密码:yfyy
C++核心编程 打造你的核心编程技能

完整视频:
C++核心编程_打造你的核心编程技能配套资料:https://pan.baidu.com/s/1F_tvZX3h6MrlCl3U6RUJtA 密码:cka8
C++关系型数据库编程 | 4天从入门到精通

完整视频:
C++关系型数据库编程配套资料:https://pan.baidu.com/s/1YETuEInQMzuhcpYpns4Xjg 提取码:i1qk
C++ STL 高级教程 | 深入浅出版

完整视频:
C++ STL 高级教程 | 深入浅出版配套资料:https://pan.baidu.com/s/1sli_-2F9IENir1ZeLjXRMQ 密码:cj6j
步步打造-frameQT自定义界面

完整视频:
步步打造-frameQT自定义界面配套资料:https://pan.baidu.com/s/1QpFmOEV6QgfJoMd3KsD0Pg  提取码:y4a8
QT从入门到实战完整版

完整视频:
QT从入门到实战完整版配套资料:https://pan.baidu.com/s/1o2MzfY-Z_5jUj5ym8BXcAg 提取码:xapf
MongoDB从配置到编程

完整视频:
MongoDB从配置到编程配套资料:https://pan.baidu.com/s/13rHVy53uCNZuAumik2ojrQ 密码:8d5k
学好linux? 从零基础系统编程开始
完整视频:
零基础学会LINUX系统编程配套资料:https://pan.baidu.com/s/17E_5UIK_naKCbSIy7IHVfg 密码:3l77
半小时快速搭建网络攻防环境-Kali操作系统

完整视频:
半小时快速搭建网络攻防环境-Kali操作系统配套资料:https://pan.baidu.com/s/1yLqeSZ9_zcvc0HXCzfHTFA 密码:49ds
C++与分布式数据库开发

C++与分布式数据库开发资料:http://pan.baidu.com/s/1o7SwLrs 密码:2g5t
c++与安全协议开发

完整视频:
C++与安全协议开发配套资料:http://pan.baidu.com/s/1pLDOmXd 密码:wyp6
C生万物之游戏内存劫持

完整视频:
C生万物之游戏内存劫持配套资料:https://pan.baidu.com/s/1BYDSXZurz2FSIpnpAaWOXw 提取码:9bzr
金山游侠开发

完整视频:
C++ 金山游侠开发|黑马程序员资料:http://pan.baidu.com/s/1nuFD7o1 密码:sabw
C++干大事系列之游戏篇:Qt飞机大战

完整视频:
C++干大事系列之游戏篇:Qt飞机大战配套资料:https://pan.baidu.com/s/11XD9Mabj9IouaWwNj_0-SA 提取码:9zuz
QT跨平台小游戏开发—黑白棋

完整视频:
QT跨平台小游戏开发-黑白棋配套资料:https://pan.baidu.com/s/1oA4skNRKcpdtIGdg7nKrwQ  提取码:e2wa
【毕设项目】使用QT实现跨平台开发“快播‘播放器

完整视频:
【毕设项目】02使用QT实现跨平台开发“快播‘播放器配套资料:https://pan.baidu.com/s/1dYy_wkuOX5MDI0jbvSNcLg 密码:wylm

moreC++学习教程

C++免费教程_C++免费教程视频_C++教程免费下载_newestC/C++免费视频,C/C++视频下载,C/C++教程_newest

There are more resources in this post

What do you need Sign in Can I download or view it without an account?Join now Scan and login on wechat

x
Translated by the Internet, your translation resource information platform, pay attention to the official account [translation information]-Official account:fanyi899
The silent monster | 2022-1-9 19:20:23 | 显示全部楼层
作为一名写了好几年 C 语言,也给很多留学生讲过 C/C++ 的学长来回答下吧。
我用 C 语言写了很多小工具,比如malloc、free,挂载到fuse上的filesystem,简易版svc等等。
总的来说,有上万行以上吧,对于指针、内存这些C语言关键点,也还算掌握得不错。
跟着我的方法学习,C语言一定没问题~~



之前出过很多学习路线的回答,有操作系统的、有 C++ 的,不少同学已经催了我几次了,让我讲下 C 语言怎么学。
首先,送大家一份我整理的包含几十本经典 C/C++ 电子书大全合集:



获取方式可以看看这篇文章,附带了电子版的PDF下载链接,赶紧收藏起来吧:
C/C++必读书籍推荐| 附下载方式
再老生常谈下,强调下 C 语言的重要性哈:



  • C 语言应该是绝大部分同学的编程第一课。
  • 对于非 CS 专业的同学,学 C 语言主要是掌握一些基本的编程方法,C 语言只是媒介。
  • 但是对于 CS 科班的同学,C 语言是后续的计组、体系结构、操作系统、编译原理等课程的基石,对于 C 语言本身甚至程序设计语言基础原理的深入理解都是应该掌握的。
对于大部分初学者,学习C语言的目的是希望做一名合格的程序员,开发出靠谱的软件来。但是学了C语言的基本语法后,发现只能开发“黑底白字”的DOS程序,完全没有漂亮的界面和生动的交互。于是学数据结构,学算法,学操作系统,越陷越深,越来越难,最后迷茫了,不知道学C语言能做什么,认为学习编程很难,开始怀疑自己,甚至想放弃。
其实,这是很多初学者都会踩到的一个坑!C语言本身是一门很简单的语言,提供的实用功能不多,大部分要借助操作系统、第三方库、单片机来完成。也就是说,只学C语言基本什么也做不了,也基本找不到工作。
C语言是一门通用性的语言,并没有针对某个领域进行优化,在实际项目中,C语言主要用于较底层的开发,例如:

  • Windows、Linux、Unix 等操作系统的内核90%以上都使用C语言开发;
  • 开发系统组件或服务,用于支撑上层应用;
既然C语言的应用这么多,为什么很多读者觉得它什么也做不了呢?
我们先说一个概念,就是库(Library)。库就是编程专家写好的代码,我们可以拿来直接使用,这样能够节省开发成本,提高开发效率,并且库代码的执行效率、严谨性、安全性和规范性要明显优于我们自己编写的代码,市场上有很多优秀的库,有的收费,有的免费,我们要善于利用这些库,尽量不要重复造轮子。
库一般分为两种:

  • 编程语言的开发者在开发编程语言的时候,一般都要预先写好常用的代码,或者说常用的功能,例如输入输出、数学计算、文件操作、网络操作、日期时间、错误处理、字符串处理等,这些由官方编写的库称为标准库(Standard Library),它们随编程语言一起发布,可以认识是编程语言的一部分。
  • 有一些组织机构或者个人也会开发一些库,有的是为了盈利,有的是业余爱好,有的是本公司正在使用的代码,开源出来造福人类,这些库称为第三方库(Third-party Library)。
如何学习?
一、一图胜千言

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


二、C 语言易学难精?

很多同学都反映 C 语言难。
实际上,相比 C++、Java 之类的更加现代的语言, C 语言本身的语法特性非常少,不像 C++ 成了一锅大杂烩。
C 语言本身只包含了编程语言最基本的语法,比如变量、if、else、for、while、枚举、结构体等,外加一个指针。
但是为什么大家都觉得难呢?
说下我大一时觉得难的原因吧,主要两点:
1. 库太少,太原始
use C 语言写个稍微复杂点的项目,你需要上来先把数据结构、常见算法先实现一遍,更别说字符串,序列化这些了。
比如 Redis 里 SDS、LIST、ZSET、HASHAnd so on.
这其实对新手极其的不友好。
想做点有趣的东西,来,先写个链表?
而在 Java 里直接 New One 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,如同发现了新大陆一般。
stay C 语言里,申请一个内存,你得随时记得在合适的地方释放。
释放得不合适? 对不起 coredump 随时等着你。
忘了释放? 对不起,内存泄露等着你~
乱写指针?对不起,内存越界等着你~
栈内存越界?VS下,烫烫烫等着你~
这些东西想必是每一位 C Programmer 的家常便饭了。
而在 Java 这类更加高级语言中,直接 new 一个就行了。
好了,扯淡完毕,在这里给出一条系统化学习 C 语言的路线吧:
第一阶段:初学少看书,多看视频

这真的是血泪教训,我大一会傻乎乎的去把课本看一遍,然后做课本后面编程练习题。
学得那叫一个艰难呀,大家都知道,课本为了保留其严谨性和全面性,往往都具有一个特点,那就是「不说人话」。
about 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 语言基本问题不大。
有需要的可以点赞后在评论区留言,我发给你~~
记得帮我 @编程指北 点个赞哟~~

There are more resources in this post

What do you need Sign in Can I download or view it without an account?Join now Scan and login on wechat

x
Translated by the Internet, your translation resource information platform, pay attention to the official account [translation information]-Official account:fanyi899
约翰38 | 2022-1-9 19:21:16 | 显示全部楼层
这个应该是几个月前的提问题了,但是C语言的问题过十年问也不晚。

一、C语言是最值得学习的语言
学习C语言,首先要明确地告诉自己:C语言是世界上最值得学习的语言.

  • 如今决定学习任何一门其他语言之前,都要先考察这个语言有什么成功项目吗?唯独C语言没有必要问,因为世界上所有最最重要的的系统中,都必然有C语言的身影。比如操作系统内核、高级语言底层等等。
  • Why?C最适合担任系统核心?主要原因可能是C语言具有和汇编语言的对应性,一条C语言代码,对有经验的人来说,可以转换为一条或多条汇编代码,也就是说编译结果具有可预测性。C代码不会在被编译时被加上奇奇怪怪的修饰,也不会在二进制兼容性方面带来大问题。这种稳稳当当的语言,一切都在掌握之中,一切荣耀归属于coder,一切错误也归罪于coder.
  • 学习C语言的同时,就自然而然的理解了硬件与操作系统的浅表一层。比如int有几个字节的问题,已经是QQ加群验证是否是程序员的一个标准了(笑),这从侧面说明了学习C语言时确实会关心底层软硬件的实现。C语言简单的基于值类型的数据类型体系(引用靠指针,指针本身也是值类型),保持了和硬件底层的一致性(即内存、缓存、寄存器只能保存值),不会出现其他语言比如C#那样既有值又有引用反而对理解底层实现制造了障碍。
  • 从某些角度上讲,C语言从设计上来说并不是为了让我们更好的写逻辑代码而设计的,它真的是“只能是这样”,没有对错好坏之分。因为计算机体系结构就是这样的、汇编就是这样的,所以C语言大致也只能是这样的,谁也不能随意捏造它。它足够简单,评论它的设计优劣意义不大。
废了这么多口舌,是为了坚定思想,端正态度,只有抱着“最好”的态度,才能排除杂念,勇往直前。时代在进步,某些东西易逝,而另一些东西持久。很多编程大师都用亲身经历告诉你,C语言永远值得用最纯粹的态度去学习。

二、学习C语言的初步路线
我们说学习任何东西,都有先把书读厚,再把书读薄的过程。也就是说,先学习大量知识和细节,然后总结归纳、提纲挈领,就彻底掌握了这门知识。
而学习C语言,一开始就不那么厚 : ) 。大道至简,只需一本:


这书中英文版均可,前面谈到过,C语言本身特性并不多,所以这些年来从C89reachC99reachC11,只是增加了一些细枝末节的改动,现在你用C89的书仍然没有什么大问题(当然还是用第二版C99吧)。不用买一堆入门到精通、高级C、本质论、Primer互相参照。C语言的教材、参考书都是这薄薄一本。
C语言的语言本身很容易“精通”,一旦你理解了指针、函数指针等问题,基本知识方面就横行无阻了,很少会遇到完全没见过的语法。
C语言基本学习过程真的没有太多好讲的,假设每天学习两小时,每周学习5天,只要动手多写例子,把例子保存好随时翻看,那么C语言的语法基础很快就能全部过完一遍,估计半个学期的时间就能看完。难点可能是在指针的使用,这需要多看资料、多画图、多写代码尝试,给自己点时间强行突破即可。
但是问题也在这里,由于宏和指针的存在,万事皆有可能。很多经典的C代码,真的是没见过之前根本不知道还能这么用,举个入门级的例子,Linux内核中的一个通用链表:

// 定义链表节点结构
struct list_head
{
        struct list_head *next, *prev;
};
// 创建链表
#define LIST_HEAD_INIT(name) {        &(name), &(name) }
#define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name)
// 判断链表是否为空
static inline int list_empty(const struct list_head *head){return head->next == head;}
// 运行时初始化链表
#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(&my_list_head));
   return 0;
}

C语言写的经典代码经常会用这种“过度简洁”的语法,初学之后会看得云里雾里的。如果你能看懂,又会有一个更大的问题——这个list_head结构体里面,没有数据。自定义数据应该放在哪呢?这又需要深一步研究了。
稍微高深点的比如任意动态语言的源码,比如Lua的源码,对于刚学懂了C语言的同学来说,真是每个字都懂,连在一起就不认识的感觉。还有一些经典算法,比如Subversion的源码,都很值得深入分析,只要理解一个模块,就会收获巨大。具体的例子这本书里提到好几个:


赏析一下书中前几个问题:
The third1章 正则表达式匹配器
The third2章 Subversion中的增量编辑器:像本体一样的接口
The third3章 我编写过的最漂亮代码
The third4章 查找
可能是知识结构不足,本书后面的例子我读起来有点不清晰。对C语言学习者来说,前几个例子非常值得一读,可以迅速意识到自己的不足并迅速成长。本书建议先找电子版试读。

PS:关于C语言开发环境
1、Windows平台,请使用Dev-C++。不要用Visual Studio,对C语言支持不完整。
2、安装Linux虚拟机,桌面版本的,比如Ubuntu,现在貌似“深度Linux”挺火,没试过。

三、关于进阶
C语言的进阶会遇到两个主要问题:
1、明白基础以后,缺少大量练习。而大量练习本身会非常费时间,因为在顾及语法的同时要顾及逻辑问题,捉襟见肘。这时候的初学者,逻辑抽象能力和语法使用都是半吊子,非常难受。
2、阅读代码方面,C语言的成熟工程代码一般会比较冗长,函数中间夹杂着很多宏和指针操作,我阅读的感觉是读后面忘前面,非常难入手。如果不明白某个函数的功能,强行将其读懂非常费时费力,容易放弃。

这样一来,学完基本知识之后的进阶之路真的非常陡峭。
我个人大胆给出C语言进阶的一个相对缓和的路线:
1、实现链表、可变长数组、哈希表等基本数据结构,实现方便的string结构体。然后大胆的用在自己写的程序中。不要怕写的有BUG,也不要怕效率不高。现代编程中容器是非常关键的武器,没有容器寸步难行。而编写容器时会练到封装、指针、内存分配,都是C语言进阶时极其重要的方面。
2、如果工作学习中用到C语言就再好不过,比如现在很多本科、硕士毕业论文都要用C语言实现,那么这时候抓住机会多练练,是最好的。
3、尝试ACM竞赛题,ACM竞赛和OnLineJudge平台,比如
http://tyvj.cn/
    类似有很多,北大、北邮这种大学都有类似的网站,上面不仅有题目,还有算法、有答案、有提示,还能直接在网页上做题。刷题可以获得及时反馈,一旦你ACIt's over3道题,那种成就感可以让你继续下去,哈哈。不过除非你兴趣就是算法本身,那么刷30道题基本就可以了,毕竟这种刷题会猛烈地提高算法能力,但是对架构能力的提升几乎没有任何作用,对大多数人来说不建议刷太多。
4、非常重要的私货:如果除了做练习题以外没有练习机会,那么请把C语言放一下,快速学习Python(首选)、Lua(次选)、JavaScript(或TypeScript更好)等能够立即实现功能效果的语言。学习好的动态语言有两方面好处:
第一:表层来说,能迅速提高逻辑代码的编写能力。用C语言构思半天才能写一点的功能,用动态语言会快速的多,动态语言将我们从内存分配、容器等基本问题中解脱出来,直接实现我们想要的效果。用动态语言实现之后,可以用C语言仿写这些逻辑代码,相当于按图索骥,直达目的。
第二:深层来说,较高级的语言对底层的语言编写有强烈的指导意义。我个人在工作中使用C++用了很长时间,但是总感觉遇到瓶颈无法突破。直到我学习了Python,写了一两个比较复杂的工具,从另一个角度突破了逻辑设计的屏障,才感觉到编程水平有了明显提高。
第三:在掌握了LuaorPython后,再找资料一边学习一边看LuaandPythonOfC源码,对提高C语言水平有实质性的帮助。

这里举一个简单的例题:一个文件中有很多对ID和字段,这些ID和字段对分别代表另一个文件。而另一个文件内容可能会链接到更深一级的文件。怎样读取这些文件组成一棵树呢?
这个问题对能力达到一定水平的人是基础问题,而对于初学者来说可能是一个门槛。这种问题我的建议是用PythonorLua的表、字典来解决,然后理清思路之后,改写为C代码。

四、总结
写了很多,感觉再写下去个人私货就太多了,并不客观。
总之C语言的学习是知识点少、难点多。上面针对初学提供了一些建议,进阶方面写了很多个人的心得体会,希望能给学习C语言的初学者和进阶者提供一些帮助。
如何学习C语言这是个挺重要的大问题,读者若有意见和建议,可以讨论交流,有问题我可以修正。

There are more resources in this post

What do you need Sign in Can I download or view it without an account?Join now Scan and login on wechat

x
Translated by the Internet, your translation resource information platform, pay attention to the official account [translation information]-Official account:fanyi899
没重复吧空 | 2022-1-9 19:22:11 | 显示全部楼层
如果题主没有什么编程的基础,我推荐你到这个网站:
This is CS50.这是哈佛大学的公开课《计算机科学导论》的主页,网页内容每年都会更新,现在是2014年秋季的课程内容。上面有授课老师提供的lecture notes, problem sheet, quiz,以及最重要的是附带字幕的最新课堂录像。


这个课程是用c语言来讲解的,来上课的学生也是大概一半人没接触过编程。看完这一系列视频,相信题主会对编程的方法论、计算机的一些基础知识,以及c语言都有很好的理解。
另外,真的要赞叹这个课的老师相当用心,课堂氛围也非常活跃,相信你会感兴趣的。
下面是我看课堂视频时的一些截图:


左边是老师在讲课,右边是PPT内容。


如果觉得PPT字太小,也可以把左右调换一下。


全屏也是可以的,而且老师讲课的场景会缩小到右上方。与上两张截图不同的是,这次有字幕(只需要点击右下角的“cc”)。

There are more resources in this post

What do you need Sign in Can I download or view it without an account?Join now Scan and login on wechat

x
Translated by the Internet, your translation resource information platform, pay attention to the official account [translation information]-Official account:fanyi899
Cheng FeifeiABC | 2022-1-9 19:23:02 | 显示全部楼层
AsC语言课程的老师,我也来凑个数吧。
在实际教学过程中,有不少同学觉得C语言学习比较困难,就我的理解,主要有两点原因。第一,C语言的语法知识太多、太琐碎;第二,反复地做算法类的编程练习,不感兴趣,不愿写程序,进而觉得入门困难。
分析了上面的原因后,我们采取了对应的策略:
首先,入门时仅讲最少需要的语法知识,一些额外的语法知识先不要学。比如++、--、复合赋值运算符、逗号运算符、switch-case语句、do-while语句等。实际上不学这些语法,也可以写出完整的程序。
其次,足够的编程量是必须的,可以充分利用在线OJ系统,会给你一个正反馈,并在初始学习编程时养成严谨的习惯。
再次,为了培养同学们对编程的兴趣,我们采用了通过游戏开发来教编程的方式,可以参考:知乎专栏 。同时,C语言中的相应语法知识,如函数、数组、指针、文件等,都是在开发游戏的实践中,遇到问题,学习相应语法知识后解决问题,从而得到更深的理解和体会。
最后,有条件的话,还是和同学一起学习,这样可以互相交流、督促。后面开发较大的游戏练习时,可以进行有效的团队合作。
希望你能和我的学生一样,写代码写的来不及吃饭、来不及睡觉,经过辛勤的努力,最后拿出非常自豪的游戏作品,向同学、朋友、家人、老师进行展示。。。在这个过程中,你的C语言会提高很快的。
<a data-draft-node="block" data-draft-type="mcn-link-card" data-mcn-id="1341790035360833536">
Translated by the Internet, your translation resource information platform, pay attention to the official account [translation information]-Official account:fanyi899
征途吃史榔 | 2022-1-9 19:23:42 | 显示全部楼层
我是一名写了N年(N > 8)C语言的软件工程师。

希望我的经验能给初学者一些建议或者启发,本文没有涵盖C语言的方方面面,但是对于想入门的初学者来说足够了。另外需要说明的是,我不是大神,真正的大神是开发C语言标准,写标准库,写编译器的那帮人,但我自认为我的C语言掌握的比周围的很多人都要好,所以才敢在这里发言。

想学一门编程语言,不知道学什么才好? 毫无疑问 C 语言啊。
C 语言是整个计算机体系的基础,往下可以操作硬件(不止X86计算机,还有ARM,DSP,单片机等各种微处理器)写Firmware,写驱动、写OS,写编译器,往上可以写 App,并且大部分的计算机书籍里的算法都是C语言描述的。
所以学会了 C 语言,就是掌握了软件领域的必备技能,以后再学其他的比如C++,Java,各种解释性语言、就是小 Case 了。
下图是一个网上流行的程序员“鄙视链”。其实我想说的是,还是有一定道理的,哈哈哈,笑而不语。




我初学 C 语言是在 2005年大二,那个时候,上课的模式是老师在上面讲,我们在下面听,然后就没有然后了,因为没有电脑练习,我根本就没有机会在课下了解更多的东西。学完了一本书,C 语言是干嘛的我都不知道,那个时候我并不知道 C 语言是用来写软件的,更何况别说软件了,电脑都没怎么见过。
我们当初用的教材名字叫 《VC++ 语言程序设计》,这导致我很长一段时间都没不知道VC++,和 C++, C 的区别,OMG!!
yes C 语言的深入学习是在研究生期间,我认真地从头到尾翻了一遍H.M.Deitel 的那本 C++,有了电脑简直如虎添翼,我有阵子天天在宿舍编程。对了,我是在学习C++的时候,顺带学习(复习)的 C 语言,反正 C++ 的书上总有会 C 的。

这里是我总结的学习 C 语言的几个步骤,其他编程语言基本类似,希望对大家有所帮助。

1. read a book

学习一门编程语言少不了先学习基本语法。
C语言的语法也就是变量,数组、指针、表达式、逻辑操作、函数,宏定义等等。学习这些先买一本入门级书籍,其实大都差不多,最经典的就是谭浩强的那本了,虽然在知乎上没少被人黑,但是毕竟流行了这么多年,总归是有可取之处的,其实作为入门书,你不能指望从它里面得到你想知道的所有东西。
除了基本语法,C 语言另一部分是标准库。
这一点很少被C语言入门书提及,但是你要想写出一个像样的程序的话,标准库必不可少。推荐这本世界级C语言专家编写的《C标准库》。




2. 写代码练习

要想学好一门编程语言,看书远远不够,一定要把书里的代码搬到电脑里。
相信大多数人都是使用的Widnows,那么就下载安装一个Visual Studio吧,用哪个版本?最新的 VS2017 毋庸置疑。
喜欢 Linux 的朋友,就先下载 Glibc 库,然后安装 gcc, gdb.
好了,有了开发环境,接下来一切变得简单,并且好玩。
试着写一些简单的代码,比如 Hello World,文件读写,数学操作,常用算法,等等。
这是我以前练手时写的




3. 总结心得体会

把你觉得很抽象、难以理解的东西放到 VS 里面进行调试,会有很多发现。我以前电脑里就经常会有一个名字叫 Test 的工程文件夹,哪里有疑惑了,就把代码放进去,一 Debug,全部的疑云就解开了。
比如这样,了解 Struct 内存结构




比如这样,了解 Union 的内存结构




比如这样,了解 指针和数组




然后把这一切,记录在一个 Word 中,这样知识就变成自己的了。

这是我从前总结的一个文档




4. 写个小作品

基本知识掌握的差不多了,试着写个小程序。
看着人生第一个自己开发的程序,会有很多的成就感,并且在写程序的过程中,你的编程能力会有质的飞跃。
我曾经写过一个控制台的五子棋游戏,可惜年代久远,现在已经打不开了。
另外需要说明的是,想在 Windows 上写一个有界面的程序的话,还需要学习Windows API,不过这仿佛是 C 语言之外的东西了,单单学习 C 语言,一个控制台程序就够了。

最后一句话作为总结,想要使自己的编程能力突飞猛进,一定要不断地勤加练习。

There are more resources in this post

What do you need Sign in Can I download or view it without an account?Join now Scan and login on wechat

x
Translated by the Internet, your translation resource information platform, pay attention to the official account [translation information]-Official account:fanyi899
xmzg1 | 2022-1-9 19:23:56 | 显示全部楼层
千万不要用谭浩强写的《C语言程序设计》。
可以选择C语言之父Dennis联合编写的《C程序设计语言》,很薄的一本书。
后续可以读一些如《C Primer Plus》之类的书。
等到掌握了基本的语法之后可以到各高校的OJ平台上做一些题。初学者推荐
Welcome to Hangzhou Dianzi University Online Judge,稍微简单的;后续可以到
ZOJ :: Homeand
Welcome To PKU JudgeOnline。在这个过程中就需要学习一些算法了。
然后应该学习一下在Unix/Linux下的编程。
最后Good Luck!
Translated by the Internet, your translation resource information platform, pay attention to the official account [translation information]-Official account:fanyi899
玉光子按 | 2022-1-9 19:24:15 | 显示全部楼层
如果之前没接触过编程,那么我建议不要从C入手,大多数新手都是被扼杀在黑框之中。先学点HTMLandCSS,在学点PHPorPYTHON吧,等对程序设计有点概念之后在去学习C,往往效果会更好。
如果你坚持选择C的话,那么我推荐两本书,先看《 C Primer Plus》 ,网上有电子版,但是最好买一本纸质书,然后再看《C程序设计语言》。
Translated by the Internet, your translation resource information platform, pay attention to the official account [translation information]-Official account:fanyi899
西西里131 | 2022-1-9 19:25:02 | 显示全部楼层
实在忍不住,想来推荐下自家特别适合新人入门的C语言课程内容。
1.《C语言入门教程》:引入大量的 C 语言程序案例,把算法和语法结合起来,通过引导大家由浅入深地编写 C 程序,让大家掌握 C 语言。将从中学会 C 语言语法、数组、模块化程序设计指针、文件的输入与输出等。
C 语言入门教程_C - 实验楼2.《C语言实现文件类型统计程序》:使用C语言实现一个文件类型统计程序。
C语言实现文件类型统计程序_C - 实验楼3.《C 语言实现多线程排序》:使用 C 语言多线程模型实现了排序算法。
C 语言实现多线程排序_Linux - 实验楼4.《3individualC语言实例带你掌握递归方法论》:通过 3 individual C 语言编程实例,让你在利用递归解决实际问题的过程中学习递归并掌握其核心思想。
3individualC语言实例带你掌握递归方法论_C - 实验楼

5.《C语言实现LRU缓存》:使用 C 语言实现 LRU 缓存,从中学习 LRU 缓存的基本概念、C 语言相关编程技巧,双向链表的 C 语言实现以及哈希表的 C 语言实现。
C语言实现LRU缓存_C - 实验楼6.《C语言实现通讯录》:使用 C 语言完成一个简单的通讯录。会涉及到结构体、数组、链表等重要概念。
C语言实现通讯录_C - 实验楼7.《C 语言制作简单计算器》:用 C 语言做一个简单的计算器,进行加、减、乘、除操作。学习 C 语言的基本语法,与输入与输出。
C 语言制作简单计算器_C - 实验楼8.《C语言实现大数计算器(加减乘除)》:adopt C 语言实现一个简易计算器,用于解决任意长度的有符号整数的加、减、乘、除运算。将利用全新的数据结构来表示大数,并将新数据结构存储的大数转化为字符用于显示。以及基于大数新的数据结构完成加、减、乘、除的计算算法设计。
C语言实现大数计算器(加减乘除)_C - 实验楼9.《C 语言实现聊天室软件》:使用 C 语言实现聊天室软件,学习并实践基本的 Linux socket 通信的相关技术,加深对 TCP/IP 协议栈的理解。
C 语言实现聊天室软件_Linux - 实验楼10.《C 语言实现 web 服务器》:使用 C 语言实现一个Web服务器。将会学习 C 语言网络开发,epoll IO 复用机制,熟悉Linux下的C语言程序编译方法,Makefile编写等技能。
C 语言实现 web 服务器_C

11.《C语言实现Linux pwd命令》:通过实现 linux pwd 命令,以理解 linux 文件系统的基本概念及内部实现,并熟悉linux系统与文件系统相关的系统调用接口。
C语言实现Linux pwd命令12.《C语言实现 FTP 服务器》:更加深入的理解套接字编程模型,并且了解应用层协议(FTP)如何在套接字基础上定义。本项目实现了支持 list,get <filename>,quit 等命令的 FTP 服务器。
C语言实现 FTP 服务器_C - 实验楼13.《C 语言实现Linux who命令》:通过 C 语言实现Linux who命令 项目的学习,可以掌握 Linux 操作系统为上层提供的访问系统数据文件的接口。更好的理解 Linux 操作系统工作的原理。
C 语言实现Linux who命令14.C 语言实现Linux cp 命令》:通过完成C 语言实现Linux cp 命令项目的学习,可以掌握Linux操作系统中的文件IO相关的系统函数和目录相关操作的系统函数,比如open, write, opendir, readir。深入了解Linux环境系统编程。
C 语言实现Linux cp 命令15.《C语言实现Linux ls命令》:本课程学习 linux 目录与文件属性,使用C语言实现 Linux ls 命令。其中涉及到 ls 的原理,如何获取获取文件的属性,掩码的相关知识。认识linux系统函数opendir(),readdir()等的调用方法。
C语言实现Linux ls命令_Linux - 实验楼

16.《C语言实现Linux touch命令》:通过完成一个C语言实现Linux touch命令项目,学习基于LINUX环境的系统编程技术,尤其 Linux 文件 IO 操作相关技术。
C语言实现Linux touch命令17.《C语言实现ping程序》:带领你学习用C语言实现 ping 命令。通过本项目中你可以更深入地理解 TCP/IP 协议,套接字编程,掌握C语言进行网络编程的技巧方法。
C语言实现ping程序_C - 实验楼18.《C语言版 Flappy Bird》:使用 C 语言来实现一个字符版 Flappy Bird,感受不一样的风采。本课程学习后将会熟悉C语言,以及绘图库ncurses的使用。本课程适合有C语言基础,想做练手项目的同学,可以有效的学习ncurses绘图库的使用,做一些有趣的事情。
C语言版 Flappy Bird

19.《C 语言实现贪吃蛇》:将在Linux平台使用C语言编程,在终端界面上玩贪吃蛇。本课程分为三个实验,实验一介绍了图像库,实验二绘制游戏图像界面,实验三实现贪吃蛇。逐步为同学们讲解一个游戏的制作过程。
C 语言实现贪吃蛇_Linux - 实验楼20.《C 语言快速实现五子棋》:用最简单的代码来实现五子棋游戏,帮助大家复习基础知识,学习了如何设计并实现一个五子棋游戏,巩固大家的基础知识。涉及到C语言的基础逻辑判断,程序设计与编写。
C 语言快速实现五子棋_C - 实验楼

21.《C 语言制作 2048》:2048是之前十分火爆的一款益智游戏。将使用 C 语言完成一个2048游戏。适合对C语言有一定基础,想做项目练手的同学,本课程学习后将会了解C语言,以及绘图库ncurses的实用。
C 语言制作 2048_C - 实验楼

There are more resources in this post

What do you need Sign in Can I download or view it without an account?Join now Scan and login on wechat

x
Translated by the Internet, your translation resource information platform, pay attention to the official account [translation information]-Official account:fanyi899
You need to log in before you can reply Sign in | Join now Scan and login on wechat

Integral rules of this edition

16

theme

16

Post

60

integral

Registered members

Rank: 2

integral
60