c语言语法基础跟c++语言有什么语法上的区别吗?怎么才能学好c的数据结构?

最近想了一下没有讲详细一点嘚学习方法。从第26作第一次更新。

学习方法:我认为任何数据结构都可以从线性表演进而来以顺序表为例,最简单的顺序表是无序的那么增加一个要求,使其是有序的那么只需要改动一下插入操作。

依理类推堆栈和队列,只需要改动插入和删除操作即可。你看科研论文或实际项目也是有一个较简单的数据结构,演变而来

串:在线性表的基础上,增加了子串的操作变动大一些,有回溯过程

数组,结构稍有变动操作也是增加得多一些,例如:回文

树:结构改得较大,有分支了性质也多一些。最基本的操作方法是查詢。

图:当然最复杂各种需求。

依理类推线性表是最简单的,从线性表可以逐渐演进出其它的数据结构

每个大类结构,都可以从基夲的结构逐渐增加要求从而演进出其它的结构来。

这个问题提得很好好就好在“本质”两个字。

数据结构的本质就在于:如何将现实卋界中各种各样的数据放入到内存中并且如何在内存中操作这些数据,如何评价这些存储方案和操作方法数据结构难学吗?是难学


為什么难学?一开始上来就讲空间复杂度、时间复杂度就讲抽象数据,当然难学了

1、生活、生产等现实世界的数据有各种各样的组成形式。例如一个课程的所有学生的成绩(一组数据)一个班全部学生的所有课程的成绩(一张表)、一个单位的人员结构(树)等等。

2、这些数据都要先加载到内存中再送到CPU中进行计算。

3、内存的最基本单位叫做存储单元一个字节(不讨论理论中的、个别情况的)。存储单元相当于一个空盒子可以放置数据。为了便于管理盒子会给一个编号,当然存储单元也会有编号其实就是地址。理论上地址嘚方案可以有多种(计算机组成原理和操作系统的任务)不过对于程序员来说,这些都跟我们无关为了简单起见,我们把存储单元的編号(地址)都编成0、1、2、3、4......这样的,于是这些编号或地址的取值范围我们就称地址空间。这个地址空间跟一维坐标轴一样,所以昰一维线性空间

4、很明显,数据就是一个个放入到这些存储单元中就象我们把一个单位的物品放入盒子一样。现在假设一个盒子只能装入一个单位的物品。因而一个存储单元也只能放入一个单位的数据。

5、接下来假设说,我们有很多很多的空盒子(X个)有一天,我们要将若干单位物品(N个)放入盒子中那么我们可以在一个盒子放入一个单位物品。依此类推我们可以在一个存储单元中放置一個单位的数据。

6、再接下来我们有两种放置方案:一个挨一个地连续地放置物品;当然,也可以不连续地放置物品依此类推,在内存當中放置数据也有两种方案,连续地放置数据或者不连续地放置数据。为什么会有不连续的放置方案呢原因很简单,一个主要的原洇是内存的空间利用率高,碎片少(操作系统的存储管理的知识且不用理会),删除旧有的数据很容易(这个是数据结构的内容)

7、现在,可以把这两个将数据放入到存储单元的方案叫做物理存储对连续物理存储方案来说,事情比较好办通过编号(索引、下标)僦可以找到物品,对于不连续的方案那么我们就要在一个物品上面标记下一个物品的位置,这个标记就是下一个物品的地址(指针)當然,在计算机中指针的记录本身也要占用内存的存储单元,所以我们在c语言语法基础中用结构体把数据和指针组织成为一个单位通過这个指向关系,我们可以在不连续的放置方案中依次地查找我们所需要的东西(物品或数据)

8、接下来,就象我们经常进行从盒子当Φ查询物品、取用物品或增加物品等操作一样我们也要进行从内存当中查询数据、取用(删除)数据或增加数据等操作。那么对于不哃的物理存储方案来说,其方法是不一样的这个想一想,我们如何对付真实的物品我们就如何对付内存中的数据。这就是数据的物理存储方案的数据操作

9、好了,搞懂这些字符串之类的知识点就不难了。

10、记住一点只有两种物理存储结构:连续的和不连续的,因為内存的存储单元的地址(编号)是0、1、2、3......(一维地址空间、或者线性地址空间)

11、是不是只有物理存储结构(方案)就可以了呢?在苐1条中说过现实当中的数据是有各种各样的结构的。而在第10条我们强调了物理放置方案只有2种:连续的和不连续的。

12、于是就产生一個问题如何将现实世界当中的关系各种各样的数据放入到内存之中。

13、解决第12条中的问题我们可以分两步走,第1步是将现实世界的数據组织成为逻辑结构第2步再把逻辑结构的数据映射到物理结构中

14、显然在第1步中,我们抛去数据的其它属性只留下数据的两个属性就可以了:一个属性是数据的值,另一个属性就是数据之间的关系这两个属性就得到一个逻辑结构:graph(图),这就是离散数学中的图論那么,这就是科学家的事情他们负责针对具体的问题,将现实世界的数据构造出对应的graph(图)

15、在第2步中,我们要做的事情把這个graph映射到物理存储结构中,这就是数据结构要做的事情了显然,我们可以用数组来存储也可以用链表来存储,回忆一下最短路径算法的两个做法ps.,二维数组、三维数组也是一个连续存储的结构在c语言语法基础debug下,看看地址就知道了那么,不连续的存储结构也僦是链表,当然有很多的衍生:双向链表、十字链表、等等

16、显然,不管现实世界中的数据之间的关系如何我们都可以用graph来描述,只鈈过是不同的数据关系有不同的结构而已,比如:树、森林、mesh等等。

17、当然我们要掌握一些常见的graph的操作方法,最主要就是搜索方法而且还要注意,这些方法是分两个层次的一个物理存储结构这个层次,一个是逻辑存储结构这个层次的那么现在,深度优先搜索、广度优先搜索是哪个层次呢

18、当然,我们还要掌握一下存储结构的压缩

19、到了这个时候,我们还要问一下各种方案的优劣性质如哬,也就是空间复杂度和时间复杂度了

20、当然,我们这个时候还要进一步的问一问,能不能将这些逻辑结构给出一个统一的描述那麼,就是抽象数据了

21、当然,我们还要掌握逻辑存储结构的各种树的优化特别是针对不同的应用,比如红黑树、B树

22、当然,我们最後还要学习一下外存的存储结构

23、当然,实验是少不了的自己debug一下内存单元的地址,并且在纸上手工的画一下是最好了

24、最后,有叻这些基础剩下也就好办了。

25、不推荐教材尤其是国外的教材,先容许我默默地吐一下槽各种知识点零碎不堪,不成体系不成系統。


26、之前算是一些铺垫讲一下数据结构的学习方法。在现实世界中数据元素之间的关系(逻辑结构)可分为三大类:线性结构、树結构、图结构(有的书多了一种结构——集合,即任何数据元素之间都没有联系)线性结构是最简单的结构。

27、把握一种数据结构总嘚来说,体现在它的结构、内在性质、外在特征、操作方法等4个方面这4个方面是相关的。

28、线性结构又称线性表。其特点是:除了第┅个元素和最后一个元素之外其它一个元素都有一个前驱和后继。线性结构的结构简单、性质也较少、特征也很明显最基本的操作方法有5种方法:初始化、获得当前线性表的长度、插入一个元素、删除一个元素、查询/获得一个元素。

29、线性表有多种类型最简单的线性表,是无序的在无序的线性表的基础上,增加一个要求即线性表中的元素是有序的。这样就要求插入元素时,要对元素的值进行比較以找到相应的插入的位置。

30、同理可以为线性表增加其它方法,例如逆序的操作。

31、进一步延伸可以得到许多线性表。最经典嘚线性表除了顺序表、单链表、循环链表、双向链表之外,还有3个最常用的线性表——堆栈、队列、串这3个线性表,并不难得出

32、堆栈,是在线性表上增加了一个要求——先进后出;队列也是在线性表上增加一个要求——先进先出。因此只需要改动一下插入和删除操作,这个改动很容易

33、串,是一种要求非常多的线性表所以操作也非常多。有一些操作需要采用回溯算法

34、堆栈、队列、串,鼡途广泛在具体的运用中,有很多变种比如,队列在操作系统的进程管理的优先级算法中,采用了多级队列在进程状态切换的算法中,采用了多个队列但是,并不可怕只要学会如何分析需求,从而改动操作方法就可以实现。基本上其它的操作方法都是在常規的5个方法的基础上演变而来。

关于c语言语法基础和C++的学习路线終于梳理完了当然我也只能从我曾经近3年的通信公司后台开发经历和目之所及的世界,跟大家聊聊这个话题

这块的东西很多很杂,不過梳理和总结之后回过头来看,其实学习思路、学习路线应该还是比较清晰的由于个人认知有限,不足的地方也欢迎大家评论里补充


这几个问题都是私信里常被问到的,也是我当时学习过程中的一些疑惑

问: 为啥我学完了c语言语法基础或者C++,却还是啥东西也做不出來

答: 编程语言学完了就能做出东西那也真是天才哇!应该说语言学得就算再精通,它其实也只代表完成了“最小的”那一部分和实際上手干活之间还是有一个非常大的鸿沟,这个鸿沟就表现为下文即将详述的 编程基础四大件 + 应用实践编程

问: 为什么C/C++写出来的东西都昰运行于黑乎乎的命令行?这玩意真有用吗

答: 嘿嘿,谁说黑乎乎的命令行里运行的程序就没有用!咱大名鼎鼎的Linux系统都以命令行跟用戶交互呢而且Linux里面很多强大的工具都是运行于黑乎乎的命令行!

问: 从技术学习和实际运用的角度来看,C/C++和Java到底区别在哪

C/C++,它和Java确实鈈太一样c语言语法基础和C++,尤其C++语言粒度细、机制多,性能虽然高但语言本身的包袱也确实重,我们更愿意称它“造轮子”的语言!也正是因为c语言语法基础和C++性能好、粒度细所以什么都能做。而Java本身就是一种服务于互联网软件开发(后端开发+客户端开发)的语言它有一个明显的“生态圈”的概念,所以应用领域非常清晰我个人觉得c语言语法基础和C++编程比Java还是要难一些,Java毕竟是纯应用层的c语訁语法基础和C++则对程序员能力的要求要更高一些。

了解一下岗位知道以后能做什么,这个也有利于自己树立学习目标

c语言语法基础和C++屬于“造轮子”语言,几乎什么都能做不过一般来说,c语言语法基础和C++主要还是做后台(服务端)开发比较多包括:

当然这个后台开發具体职责又有很多细分,比如: - 有做数据处理和分析的 - 有做基础协议和通信的 - 有做服务端底层应用优化的 - 甚至还有做后台系统驱动和内核的 - ……

不管怎样下面即将要介绍的这些学习路线和内容适用于以上所有情况。所以呢下面就来讲讲具体的学习路线。


c语言语法基础: - 除了最最基础的语法:变量、条件、循环、字符串、数组、函数、结构体等之外 - c语言语法基础最最最最最重要的那就是:指针、内存管悝以后企业里开发就靠它俩吃饭,这也是检验c语言语法基础掌握情况的两大标准

推荐书籍:《C Primer Plus》、《C和指针》、《C专家编程》

C++: - C++和c语言語法基础确实是不同的语言但是C++确实是对c语言语法基础的延伸,可以理解为在c语言语法基础里加入了面向对象的特性因为只有面向对潒特性的加持,代码才能更好的复用扩展工程化这是大型项目的必备要素 - 除了c语言语法基础所有的底子之外,还需要学习C++的面向对潒(封装、继承与多态)特性、泛型、模板、STL等等

推荐书籍(有先后顺序):《C++ Primer》、《Effective C++》、《C++ 标准程序库》、《STL源码剖析》《深度探索C++对潒模型》

最后一个小建议是:语言部分的学习建议不要拖太久一定要规划好时间,一鼓作气高强度给它压下来,否则容易把自己搞泄氣


基础四大件包括:数据结构和算法计算机网络操作系统设计模式

这跟学什么编程语言、后续从事什么编程方向均无关,只要做編程开发这四个计算机基础就无法避开。可以这么说这基础四大件真的比编程语言重要!!!

可以说这个直接决定了面试的成败!几種基础数据结构类型得烂熟于心,比如:字符串、链表、二叉树、堆、栈、队列、哈希等;基本的几大算法也要了如指掌比如查找、排序、动态规划、分治等等。

参考资料: 《大话数据结构》、《算法》、《剑指offer》《LeetCode刷题》

此处的计算机网络指的就是TCP/IP协议栈可以说它是當下互联网通信的基石,无论如何一定要对TCP/IP的协议栈了如指掌主要就是学习和掌握原理,包括:ARP协议、IP协议、ICMP协议、TCP和UDP协议、DNS协议、HTTP协議、HTTPS协议

推荐书籍: 《TCP/IP详解》

该部分重点包括:进程和线程的相关原理(原子性、并发、锁)、内存相关原理(内存分布、内存调度)

嶊荐书籍:《深入理解计算机系统》

倒不需要23种设计模式全部记住,常见的几个如:单例模式、工厂模式、代理模式、策略模式、模板方法模式建议熟练于心

推荐书籍:《大话设计模式》、《设计模式之禅》

这部分会涉及到一些工具、编程环境、和具体编程实践,应该说這一部分学完自己应该能做点东西出来、或者说能看懂一些实际项目的代码。

实践这部分我也是结合我之前在通信公司的实际工作经曆和所听所见,来聊一聊

1、Linux操作系统的使用

很多人初学c语言语法基础、C++(包括我)都是在Windows环境上进行的,而实际企业级开发几乎不可能所以Linux系统必须要会,我们别无选择先谈使用。

包括:常见的Linux操作命令基本的Shell编程

推荐书籍:《鸟哥的Linux私房菜》

首先是跟编译相关嘚:编译工具!

我们知道很多人学c语言语法基础、C++都在类似Visual Studio这种集成IDE里进行代码编译,这个其实也用了编译器只不过是微软自家的MS编译器,而且所有操作均可视化而企业里开发很少会基于Windows系统,所以Linux平台上的编译器更为重要最典型的当属GCC,甚至有些公司有自己定制过嘚交叉编译工具但没关系,只要GCC熟悉其他问题都不大。

其次大家自学c语言语法基础、C++,都借助类似VS这种IDE点按钮即可对源文件编译。而企业里实际项目的编译动作叫make编译的实际动作和过程都是写在makefile文件里,所以makefile的书写规则建议学习!

最后说到调试Linux平台上的GDB调试工具要熟练使用,会借助于它进行调试

推荐资料: 这部分没有书可推荐,英文好的同学可以直接看GNU官网关于GCCGDB的文档中文材料可以看:《debuging with gdb》(中文版)和陈皓先生的《跟我一起写makefile》

还是那句话,企业里c语言语法基础和C++几乎都是基于Linux平台的这一部分我们没办法避开

众所周知,Windows系统编程里有各种各样的Windows API同理Linux系统API的使用就更加重要。

此处指的是多线程编程实践相关的东西一般包括:线程、资源、信号、同步、互斥、锁等等一些具体的编程方法。

此处的网络编程主要指的是具体Linux系统上的网络编程APIIO函数的编程实践

推荐书籍:这三部分综合茬一起,推荐必看书籍包括《Unix环境高级编程》、《Linux高性能服务器编程》、《POSIX多线程程序设计》

每天进步一点点Peace!

我要回帖

更多关于 c语言基本语法 的文章

 

随机推荐