你知道怎样学习C语言吗?

如何学习C语言,在学习C语言的时候一定要掌握什么知识?在这里我给大家写出了一点点小计划,不喜勿喷,谢谢!

《C Primer Plus》、《C缺陷和陷阱》、《C和指针》、《C专家编程》。

1、 strlen()函数的返回值是什么类型的?

2、 字符串strlen() 的值,是否和他占据的内存空间相同?

3、 你是否知道strcpy 函数存在的潜在风险?如何避免?

4、 如果一个字符串没有字符串结束符,而调用str 开头的库克,会发生什么?

5、 Strcpy(),strcat(),strcmp(),strncpy(),strncat(),strncmp()内部到底是如何运行的?这些函数到底对源字符串和目标字符串做了些什么?你是否观察过它们运行时两个字符串内存的变化?

6、 上面这些函数使用时,各有哪些需要注意的地方?

7、 你会几种字符串查找操作?

8、 c语言中有字符串这个数据类型吗?

9、 对字符串进行操作的时候,是否为字符串结尾符预留存储位置?不然的话容易造成非常访问内存。

1、 你肯定知道,定义“int a[10]; ”, a[10] 这个元素是无效的。

2、 你知道几种数组初始化的方法?

3、 数组和指针有千丝万缕的联系而又不同,你是否对他们在不同情况下的使用进行过详细的总结?

4、 “int calendar[10][20]; ”,这是一个什么样的数组?它拥有 10 数组类型的元素,还是 20 个?

5、 “int a[10]; ”,数组名 a 在本质上是一个什么?你是否打印过 a 的值?

6、 你知道几种获取数组某元素的方法?

7、 指针和数组相同吗?什么时候相同?什么时候不同?

8、 用指针和下标访问数组元素,那种方式更快?

1、 你知道什么是位域结构体吗?如何定义它?如何使用它?

2、 你知道字节对齐对结构体占用内存空间大小的影响吗?如何计算结构体占用内存的大小?

1、 你知道宏的本质是什么吗?函数?语句?类型定义?或者其他?

2、 你知道语言设计者为什么设计宏大吗?这些原因目前是否仍然成立?

3、 你会设计带有参数的宏吗?

4、 你知道使用宏的参数的时候的注意事项吗?

5、 你会设计带有可变参数的宏吗?

6、 你知道使用宏有什么劣势吗?

7、 你有没有更好的替代方案?

1、 是否可以指定枚举中各项的值?

2、 如果不指定值,枚举的第一个值是多少?

3、 枚举的值是否可以是负数?

4、 定义枚举的时候,你是否专门定义了枚举的最小值和最大值?

1、 switch(c)中的 c 的数据类型有哪些?

2、 你是否在所有的switch 中都加了 default 语句?

3、 是否在所有的case 中都加了 break 语句(一般情况的做法)?如果你不加 break ,将会发生什么?

1、 static的三个主要作用是什么?

2、 static的修饰的局部变量是保存在什么地方的?全局变量哪 ?

3、 static修饰的全局变量和函数,在其他的文件中是否可以访问?如何访问?

4、 你知道static 是 c 语言中是实现封装和隐藏的利器吗?你是否经常使用?

5、 定义在不同源文件中的static 全局变量,编译器是否允许他们的变量名称相同?他们在内存中的地址是否相同?函数那?

1、 你是否经常使用const 来表明不能够被更改的变量?

2、 你是否经常使用const 常量来代替宏?

3、 下面四种情况,你知道是各自表示什么意思吗?

int i_value= 10;

const int* pvalue = & i_value

int const *pvalue = & i_value

int* const pvalue=& i_value

const int* const pvalue =& i_value

4、 你知道const 常量如何初始化吗?

1、 对于字符数组,strlen 和 sizeof 的值是否相同?

2、 S izeof本质上是函数还是宏?

3、 S izeof的返回值是什么类型?

1、 “int *p; ” &p , p , *p 他们的值分别表示什么含义?

2、 你定义的指针初始化了没?

3、 你理解指针的指针的概念吗?你会使用吗?

4、 “int *pi_value; pi_value = 0x100000; ” pi_value + 1 的值是是多少?

5、 你会定义函数指针吗?

6、 你会使用函数指针调用函数吗?

7、 关于指针和数组,请参见知识点数组。

1、 动态分配的内存是保存在什么地方的?

2、 什么情况下使用动态分配内存?

3、 动态申请内存一定要释放,否则会内存泄露。你是否使用过内存检测工具?

1、 如何查看函数在内存中的地址?

2、 如何给一个函数指针赋值?

3、 你是否会定义可变入参函数

4、 你是否可以区分函数的形参与实参?

5、 如何定义函数名,以准确的表达函数的用途?

6、 你是否使用const 来修饰函数入参和返回值,以表的特定的含义?

7、 递归如何使用?

1、 全局变量,局部变量,常量分别保存在内存中的什么地方?

2、 不同类型的变量,你是否知道其作用域?

3、 全局变量和局部变量是否可以重名?你是否在这样做?

4、 局部变量在函数退出后是否有效,为什么?

5、 全局变量为什么不允许定义在头文件中?有何危害?

1、 链接位于编译过程的那个阶段?

2、 动态链接库和静态链接库使用时有何区别?

3、 如何 对 动态链接库 进行 动态加载 (不用重启程序而加载链接库)?

4、 动态链接有何优点?

5、 动态链接库中是否定义了非static 的全局变量?你是否知道这是一个非常危险的动作?

6、 动态库中的全局变量(非static )和函数(非 static )是否可以和上层全局变量和函数重名?重名后会发生什么事情?

1、 你知道什么是段的概念吗?

2、 可执行程序可以分为几个段?每个段保存的是什么内容?

3、 如何查看可执行程序各个段的大小?

4、 当函数被调用时发生了什么?

5、 你有没有试过程序的栈空间最大有多大?程序超过此大小会发生什么?

6、 你使用的系统的栈是向下生长的,还是向上生长的?

1、 如何避免对同一头文件的多次include ?

1、 什么是 声明 ,什么是定义?

2、 你是否会运用c 语言声明的优先级规则?

1、 软件的首要技术使命 是 管理复杂度。

2、 优秀程序员的 一个特质 是将复杂的事情简单化,而非将简单的问题复杂化。所以,他们一般会选择简单的解决方案。

3、 极尽机巧,复杂的解决方案,除了将新手搞得晕头转向之外,别无他用。

4、 阅读优秀程序员的代码,是一种享受,你很少遇到思维的阻力,你可以尽情的享受简单之美。

这些是C/C++能做的

服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等。

对于热爱编程的人来说,有一群一起学习一起解答的小伙伴很重要!如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

编程学习书籍分享:

编程学习视频分享:

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

如何系统地学习 C++ 语言?太全面了

hello,大家好,我是 Jackpop,硕士毕业于哈尔滨工业大学,曾在华为、阿里等大厂工作,如果你对升学、就业、技术提升等有疑惑,不妨交个朋友:

C++是一种通用的、面向对象的编程语言,可用于开发操作系统、游戏、图形用户界面、后端以及高性能系统和应用程序。

所以,尽管Python、Go这些后起之秀近几年热度非常高,但是在很多领域还是无法撼动C++的地位。

今天,就从浅到深,从入门到实战,教你如何学习C++。

篇幅较长,先给出本文的目录:

  • C++简介
  • 什么是C++?
  • 为什么学C++?
  • C++的历史
  • C和C++的区别
  • 编译型语言和解释型语言
  • 从入门到实战
  • 开发环境
  • C++入门
  • C++练习
  • C++实战
  • C++进阶
  • 学习资源
  • 书籍
  • 视频课程
  • 开源项目

下面,就正式开始本文的正式内容吧!

现如今,流行的编程语言非常多,Python、Go、Java、PHP、JavaScript等等,它们各有自己擅长的领域和方向。

而C++则在系统资源和内存控制更胜一筹,因此,在操作系统、图形图像、游戏、嵌入式这些对性能要求较高的领域,C++一直都具有不可替代的地位。

它可以用来开发在多个平台上运行的应用程序,如服务器、个人电脑、基于云的系统和移动设备。

如果你对计算机游戏、高端计算项目的软件工程、加密货币挖矿程序和开发移动设备的操作系统等领域感兴趣,学习C++则是必不可少的。

此外,相对于Go、Python这些更加高阶的编程语言,会涵盖更加全面的编程知识,也有助于学习者理解变量、函数、面向对象、指针、内存…这些在很多高阶语言中容易被忽略的概念和知识。

C++是由丹麦计算机科学家Bjarne Stroustrup(比雅尼·斯特劳斯特鲁普)创造、设计和开发的。

斯特鲁斯特鲁普想制造一种类似于C语言的灵活和动态的语言,但是,需要拥有更多的功能。

它最初被称为 \”C with classes\”,在1983年被重新命名为C++,意思是 比C高一等。

国际标准化组织的C++联合技术委员会在1998年至2017年间对C++进行了五次升级。

一个新的版本,C++20,计划也在计划中将要发布。

C和C++有哪些区别?

这是在学习C或者C++时无法绕开的一个问题。

Jon Kalb(软件工程讲师、C++ Now和CppCon的主席)说,C++是C的进化

虽然它们有一些相似之处,但现在两者有很大的不同。

虽然C语言被广泛使用,但Kalb说它并不像C++那样支持抽象、通用编程和面向对象编程。

在大型项目中,往往需要非常高层次的抽象,在这方面C++要远胜于C语言。

抽象层指的是观察或编程一个系统的复杂程度。低层次的抽象有更多的细节,而高层次的抽象可以包括整个系统。

C语言是一种程序性语言,它的代码由指令组成,直接告诉计算机或其组件按逻辑步骤完成一项任务。

C++也可以做到这一点,而且,在此基础上它支持高级功能,如类和面向对象,它允许程序员创建包含数据和功能的 \”对象\”。这种方法的优点是,软件对象比程序性指令执行得更快,更容易执行,而且面向对象的编程使代码更容易修改、维护和调试。

提起编程语言,就必须先要理解语言所属类型 。

编程语言可以分为编译型语言和解释型语言,下面分别解释一下。

编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。比较有代表性的有C、C++等。

解释型语言:相对于编译型语言存在的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,程序在运行时才翻译成机器语言,每执行一次都要翻译一次,因此效率比较低。比较有代表性的包括Java、Python、JavaScript等。

因为C++很受欢迎,所以有很多资源可供初学者使用,包括在线教程、网站和书籍。

当决定学习C++或任何其他计算机语言时,你首先要清楚将它用于什么方向、什么岗位。

如果你从事机器学习、深度学习、数据分析这些偏重于算法和分析、对性能不敏感的岗位,你完全可以选择R或者Python这些语言替代。

但是,如果你从事游戏、系统等对性能有严格要求的岗位,C++则是首要的选择。

下面,就开始学习旅程吧!

如前面介绍的那样,C++属于一种静态的编译型语言,所以,开发环境配置过程中就需要用到对应的编译器。

C++有很多编译器可以用,GCC或GNU Compiler Collection是最流行的C++编译器之一。

下面是不同操作系统下的编译器安装方式。

如果你使用的是Linux,可能已经默认安装了GCC。

如果没有,可以通过如下命令安装:

Linux下的IDE可以选择Codeblocks IDE或Eclipse CDT在Linux。

在Mac上,你可以使用Clang或GCC,两者都是免费的。

虽然GCC支持更广泛的C和C++标准,但Clang在大多数情况下都能正常工作。

可以使用Homebrew安装GCC:

开发工具方面,可以选择Visual Studio Code或者Xcode。

在Windows上有很多好的编译器。

在Windows上,Visual Studio提供了一个C++编译器,该编译器还可以构建C语言程序。

Visual Studio有自己强大的、功能丰富的IDE,对于任何开始使用C或C++的人或主要针对Windows平台的人来说,它是一个很好的选择。

如果你想要更符合标准的编译器,GCC(MinGW)也可以使用,Codeblocks IDE通过设置就可以满足需求。

IDE方面,Clang是目前比较好用的的工具,除此之外,还有一些跨平台的IDE,如Eclipse CDT、Jetbrains CLion和Netbeans,它们提供了功能齐全的C和C++开发环境。

最近,Visual Studio Code非常火热,在很多编程语言比较受欢迎,它也可用于Linux和Mac环境。

语法是一种编程语言的核心,也是用C++开发的基础,就如同我们说汉语、英语一样,语法定义了C++代码的组成和理解方式。

下面看一段示例代码:

#include <iostream>:这是一个头文件库,将功能导入到程序中。该命令的含义是程序从一个名<iostream>的文件中导入内容,该文件代表输入和输出流。

using namespace std:指的是来自标准库(std)的对象和变量名称,通常用关键字std和运算符::来缩写。

int main ( ): 指定了一个主函数。函数是C++程序的一个重要部分,因为它们在代码中定义了一个动作,包含在括号{ }中的代码将被执行。

cout(读作see-out):是一个定义输出的对象,也就是代码中的字串,这里会输出Hello World

return 0:指示程序不返回任何东西,文本字符串将是唯一的输出。

<<:是一个用于命名对象的操作符,而;(分号冒号)则作为一行代码的结束标识。

把这些放在一起,就组成了一段完成的C++代码。

通过这段简短的代码就简单的涵盖了C++中的一些基本语法,如果不首先学会基础语法,看这段代码如同天书一样,不知道它在做什么?它有什么含义?

如果了解基本语法,就能够像看一段汉语一样轻松理解它表示什么。

基本语法只是入门的一个方面,除此之外还要对如下内容有基本的认知:

  • 函数–一个函数是一组语句,它们共同执行一项任务,每个C++程序至少有一个函数
  • 数组–数组是一种数据结构,用于存储固定大小的同类元素的顺序集合
  • 字符串– 字符串是由字符组成的一维数组,以空字符\’/0\’结束
  • 指针– 指针是变量,其值是其他变量的地址。指针有助于更容易地执行C++任务,有些任务没有它们就无法执行
  • 引用–引用是一个别名,是一个已经存在的变量的另一个名字。如果一个引用被初始化为一个变量,那么这个变量的名字和引用的名字就可以交替使用来指代这个变量
  • 类和对象–类是C++的一个关键特征,通过将数据表示和操作该数据的方法结合到一个包中来指定一个对象的形式
  • 多态–多态意味着有多种形式。在C++中,这指的是调用一个数值函数导致不同的函数被执行,这取决于调用该函数的对象的类型

在入门C++并学习了一些C++编程技巧后,接下来需要做的就是把它们好好利用起来了,在实战中打磨并熟练C++。

做到这一点的一个方法是通过做一个项目来了解该语言的各个方面是如何结合起来的。

目前Github上有很多相关的项目,我们可以通过阅读相关的代码,理解它的实现过程,然后自己复现相关的项目来起到实战的作用。

也可以根据自己感兴趣的领域,给你寻找一些相关的需求场景,然后通过C++实现相应的工具或者软件。

例如,开发一款简单的小游戏、实现一个文献翻译工具、开发一个简易的计算器等等。

中级和高级C++编程建立在基础知识之上。

《C++ Crash Course》一书的作者Lospinoso说,在中级阶段,程序员需要了解引用和指针如何工作。支撑最强大的C++功能的其他核心概念,例如,对象生命周期和多态。

对这些概念如何理解、如何使用,以及如何高效的应用于项目中,则是走上进阶路线上必须学会的。

在进阶之路上,一个C++程序要做的就不再是如何通过基本语法或者面向对象编程去实现一项功能或者一个系统,而是学会并熟练通用编程、泛型编程,也就是说,需要考虑代码的通用性、可扩展性,以便后续可以更好的向后兼容,以及更加容易适应多平台的需求。

想必绝大多数从事C++开发的同学都看过,至少听过这本经久不衰的经典书籍。

这是一本全面、细致、权威的C++书籍,对零基础小白非常友好,即便没有任何编程基础,在阅读过程中也不会有太大障碍。

而且,相对于很多数据喜欢给出伪代码,这本书中给出大量完整、可执行的代码,这对于基础较弱的同学上手训练非常良心。

此外,这是一本站在更高层次讲解C++的书籍,对比很多书籍一味的讲解概念和理论,它用更高层次的视角教授C++,比如,哪里有潜在问题?哪些地方需要着重注意?它都会给出详细的提示和阐述。

C++大师StanleyB.Lippman、C++标准委员会原负责人JoséeLajoie、C++先驱BarbaraE.Moo三位C++领域大牛合著的一本经典C++书籍,也倾注了三位大牛对C++独特的理解。

相对于很多书籍单纯的概念讲述,《C++ Primer(中文版)》从因到果,由浅入深,由表及里娓娓道来,从语言的简单用法,到为什么这样设计语言,你不仅能从一个语言使用者的角度看问题,更能站在一个语言设计者的角度思考这种语言的设计优劣。

而且,这本书完全可以作为一个参考字典使用,在日常C++开发过程中遇到的很多语法和编译问题在这里都可以寻找到答案。

相对于《C++ Primer Plus(中文版)》和《C++ Primer(中文版)》的全面而厚重,《Essential C++中文版》显得”轻薄“很多。

相对于前两本的全面,这本书更加注重C++进阶部门的讲解,全书围绕procedural(面向过程的)、generic(泛型的)、object-based(基于对象的)、object-oriented(面向对象的)着4个面向进行详解,从这里,你可以学到很多C++的高阶用法

标准库是C++一个非常重要的组成部分,在C++开发中也是无法绕开的一个部分。

《C++ 标准库》这本书详细讲解了每一标准库组件,包括其设计目的和方法、复杂概念的剖析、实用而高效的编程细节、存在的陷阱、重要的类和函数,除此之外,还大量用 C++11 标准实现的实用代码范例,覆盖全新组件、特性。

这本书重点着眼于标准模板库(STL),涉及容器、迭代器、函数对象以及 STL 算法。

这是一本来自全世界知名C++软件开发专家Scott Meyers的经典书籍,这本书更像是一本经验的积淀。

如果你想沿着C++的方向一直走下去,我建议《Effective C++》一定要读,它提炼和升华了作者在C++开发过程中多年的实战经验,这些都是C++程序设计和优化过程中宝贵的经验,也是普通程序员和高阶程序员之间差距的关键所在。

这是继Effective C++之后,Scott Meyers于1996推出这本续作,相对于《Effective C++》也更加高阶。

这本书比较适合有一定经验的C++开发人员,对于C++初学者有一定难度。

其实,仔细阅读上面介绍的6本书籍对于C++的学习就已经足够了。

但是,不同同学有不同的学习偏好,有的同学喜欢通过看书学习新知识,有的同学则更加倾向看视频。

所以,这里也给大家推荐两个视频课程,都是免费的。

内容包括基本理论、类与对象、构造与清除、函数、引用、继承与多态、拷贝构造、运算符重载、异常、模板和流等,课程中贯通汇编、操作系统等知识,深入浅出,在这个课程里可以看到很多有关上面这些经典书籍的影子,可以说是一份比较用心的课程。

B站上一个颇受欢迎的C++视频课程,目前播放量已经超过1500万,从基本语法到进阶知识,从概念理解到动手实践,没有多余的话术,纯干货的视频教程,对初学者非常友好。

我个人认为,开源项目是学习一门编程语言非常快捷且行之有效的方法。

得益于强大的Github,提供了很多开源优质的项目,在这些项目中,我们可以学习那些优秀程序员的编码方式、学习并借鉴它们的程序设计模式。还能够从这些项目中得到一些灵感,去动手做一些实战项目,让我们从书本的理论知识中走出来,走向贴近实际场景的项目,让我们的技术得到升华可提炼,让我们从一个普通C++程序员进阶到一个高阶C++程序员。

Star:24.4k

C/C++ 技术面试基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识。

这是一个比较适合初学者的C++项目,沉淀了面试过程中C++相关的一些问题和解答,这些知识相对于书本上的内容,更加贴合项目实战,往往都是实际项目中会遇到的一些问题。

因此,这个项目可以让我们脱离书籍和教程,学到很多有实战价值的C++知识和技巧。

Star:1.7k

这是一个利用C++实现的俄罗斯方块的小项目,相对于那些大型项目,这个项目对初学者比较轻松,而且把C++和耳熟能详的游戏开发有机的结合到一起,这会让学习者有更加直观的感受,也有更加强烈的代入感,能够把学习者的注意力吸引到程序的设计过程中。例如,如何实现方块图像?如何实现方块的移动和选择?如何实现消除和积分功能?

这些抛出的问题在这个小项目中都可以找到解答。

Star:6.3k

就如同前面介绍的那样,STL是C++中很重要的组成部分,是学习C++无法绕开的概念。

MyTinySTL通过一个个代码示例,配以详细的注释详解,让初学者更加清楚STL的用法,对于刚学完基础知识想要夯实基础的同学非常有价值。

到这里,介绍了几个比较适合初学者的开源项目,这些比较适合刚撇下书本,需要用一些实战项目来练手、提升自己对理论知识印象和理解的同学,下面再介绍几个进阶实战的开源项目。

Star:1.4k

Cytopia是一个免费的、开源的复古像素艺术城市建设游戏,它采用了基于SDL2的自定义等距渲染引擎。

在这个项目中涉及到游戏开发中的很多关键因素,例如,渲染引擎、UI系统、摄像机平移缩放、地形操作、声音效果等等。

这是一个比较完整且丰富的开源项目,对游戏开发感兴趣的同学可以深入学习一下。

Star:4.1k

OpenTTD是一款运输模拟游戏,基于Chris Sawyer编写的流行游戏Transport Tycoon Deluxe。

它试图尽可能地模仿原来的游戏,同时用新的功能来扩展它。

OpenTTD采用GNU通用公共许可证2.0版,但包括一些采用不同许可证的第三方软件。

Star:5.8k

devilutionX是《暗黑破坏神》和《地狱之火》的源码移植,它努力使游戏的运行变得简单,同时提供引擎改进、错误修复和一些可选的生活质量功能。

Star:25k

calculator是一个用C++编写的Windows计算器程序,预装在Windows中。

没错,就是我们现在在Windows操作系统中使用的那个计算器。

该应用程序提供了标准、科学和程序员计算器的功能,以及一组各种测量单位和货币之间的转换器。

Star:7.9k

DearPYGui是一款用C++开发,适用于Python的快速而强大的图形用户界面工具包,具有最小的依赖性。

在这个项目中,可以学习如何使用C++实现UI界面,进行图形图像的开发。

Star:3.2k

Clementine是一款适用于Windows、Linux和macOS的现代音乐播放器和资料库组织工具。

通过这个项目,我们可以学习如何通过C++处理音频文件,以及实现文件的组织与管理。

Star:9.6k

zeal是一款由C++开发的离线文档浏览和阅读工具,通过这个项目会涉及到Qt、cmake、libarchive、SQLite等工具的用法。

开源项目这里,我共介绍了10个项目,涉及到实战知识、游戏开发、用户界面、游戏引擎、媒体播放、文档工具,有比较适合初学者的,也有适合C++进阶的,大家可以根据自己感兴趣的方向选择适合的项目进行深入了解和学习!

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。