超详细 c 语言回顾
前言
c 语言是一种底层语言,是一种系统底层级的语言,例如Windows、Linux、Unix等操作系统就是使用c语言编写的。所以由此看来,不论是火爆了25年的Java,还是近年来愈来愈流行的Python,它们虽外表光鲜亮丽,但c语言就是内在的灵魂,朴实无华。
c 语言特性
c 语言既然这么重要,但是它有什么值得我们去学的地方呢?难道我们就因为听到别人说它重要我们才去学习吗?我想我们更加在意的是学完我们能掌握些什么,能让我们获得什么。
c 语言的设计
c 语言是1972年,贝尔实验室在开发Unix操作系统是设计了c 语言。c 语言是一门流行的语言,它把计算机科学理论和工程实践完美的融合在一起,使用户能够完成模块化的编程和设计。
c 语言具有高效性
c 语言是一门高效的语言,它被设计用来充分发挥计算机的优势,因此c 语言程序运行速度很快,c 语言能够合理的通过操纵内存来获取最大的运行速度。
c 语言的可移植性
顾名思义,可移植性就意味着,对于在一台计算机上编写的c语言程序可以在另外一台计算机上轻松地运行,从而极大的减少了程序移植的工作量。
c 语言特点
- 简洁:因为c语言设计更加靠近底层,因此不需要有像Java、c# 等高级语言才有的特性,程序的编写要求不是很严格。
- 结构化:它提供的控制语句具有结构化特征,如for循环、if… else 判断语句和switch语句等。
- 数据类型丰富:不仅有传统的字符型、整形、浮点型、数组 类型等数据类型,还有其他编程语言没有的数据类型,例如指针。
- c 语言能够直接对内存地址进行读写,因此可以实现汇编语言的主要功能,并直接可以操作硬件。
- c 语言速率快,生成的目标代码执行效率高。
下面着重整理下c 语言知识点
程序的环境和预处理
环境
环境分为执行环境和翻译环境——预编译、编译、汇编、链接;
预处理
预定义符号:
- _ FILE _ //进行编译的源文件
- _ LINE _ //文件当前的行号
- _ DATE _ //文件被编译的日期
- _ TIME _ //文件被编译的时间
- _ STDC _ //如果编译器遵循ANSI C,其值为1,否则未定义
数据
数据类型
整形:
-
char:
unsigned char , signed char;
-
short:
unsigned short [int]
signer short [int]
-
int :
unsigned int
signed int
-
long :
unsigned long [int]
signed long [int]
浮点型:
- 单精度浮点型:float
- 双精度浮点型:double
构造类型:
- 数据类型
- 结构体类型 struct
- 枚举类型 enum
- 联合类型 union
指针类型:
空类型:
存储类型
整形:在内存中存放的是补码
常量变量
常量
常量分为:字面常量、const定义的常量、#define定义的标识符常量、枚举常量。
变量
变量需要注意变量的命名规则,变量的初始化和赋值、以及根据是否有static修饰分为:全局变量和局部变量。
作用域
作用域分为:代码块作用域、文件作用域、原型作用域、函数作用域。
链接属性
至于这个概念我们应该基本了解什么是外部链接属性,什么是内部链接属性以及什么是无属性即可。
语句
- 表达式语句:在表达式结尾加上分号称之为表达式语句;
- 循环语句:例如while语句,do … while 语句,for 语句,以及 break 和 continue 的用法;
- 分支语句:if 语句,switch 语句,goto 语句(少用);
- 空语句(特别注意):只有一个分号的语句,不执行任何操作的语句。
操作符
操作符在实际编程中用到的也比较多,在这里仅仅采用提示性的方式列举一部分。
算术运算符:(+ - * / %)、移位操作符(<< 左移 ; >> 右移)、 位操作符(& 按位与,| 按位或 ,^ 按位异或)、 赋值操作符( = )、 复合操作符(+= , -= ,*= ,/= ,%=,>>=,<<= ,&=,|=,^=,)。
单目运算符的回顾
逻辑反操作(!)、负 值(-)、正值(+)、取地址(&)、操作数的类型长度(以字节为单位 sizeof)、对一个数的二进制按位取反(~~)、间接访问操作符(解引用操作符 *)、(类型)强制类型转换。
还有一些较为常见的关操作符,逻辑运算符 :逻辑与(&&)、逻辑或(||),条件操作符、逗号表达式、下标引用、函数调用和结构成员等也要进行联想,明白各个术语到底是怎么回事。同时我们也要明白操作符的优先级、结合性以及是否控制求值顺序这些属性。
函数
函数的分类:
函数是由函数名、函数参数、语句项和返回类型构成的为了单独实现某种功能而编写的子程序。函数一般分为库函数和自定义函数。比较常见的库函数有IO函数,字符串操作函数,字符操作函数,内存操作函数,时间/日期函数,数学函数,其他库函数等。另外如果想了解更多 c 语言的库函数,可以访问http://www.cplusplus.com/reference/ 去详细的了解库函数。同时在自定义函数时像函数的参数不要过多,代码的可复用性以及函数参数和返回值的设计是否满足功能的要求等都需要注意。
函数的声明和定义:
函数的声明就是要告诉编译器有一个函数叫什么,参数是什么,返回类型是什么,但是具体是不是存在,无关紧要;同时,声明一般出现在函数使用之前,要满足先声明后使用这一条件;另外,函数的声明一般要放在头文件中。
函数的调用:分为传值调用,地址调用,嵌套调用和链式访问。
数组
数组创建和初始化后在内存中从低地址到高地址连续存放。数组又分为一维数组,多维数组(存放着n-1 维的一维数组)和指针数组(数组里存放着指针元素)——例如:int *arr[10] 。
创建数组后需要使用时,这就需要我们对数组进行访问。数组的访问有下标访问和指针访问两种形式。
指针
指针就是用来存放地址的变量。指针除了常见的基本类型外,还有数组指针,函数指针,如果想要详细的学习下指针,可以参考下我之前写过的一篇文章。在这篇文章里可以较为深入的了解下指针。同时在这里也要特别提起两个名词:解引用和二级指针。解引用就是取出指针所指向地址处的值;二级指针就是存放一级指针地址的指针。
字符函数和字符串函数
c 语言中对字符和字符串的处理很是频繁,但是 c 语言本身是没有字符串类型的,字符串通常放在常量字符串或者字符数组中。要想进一步了解字符串相关的函数,可以在公众号后台回复 c语言知识点 获取已被整理好的完整的思维导图。
动态内存管理
动态内存函数有 “malloc,calloc,realloc,free”。动态内存一般有如下常见的错误:
- 对NULL指针的解引用操作
- 对动态开辟空间的越界访问
- 对非动态开辟内存使用free释放
- 对同一动态内存多次释放
- 动态开辟内存忘记释放(内存泄露)
后记
最后友情提示,公众号 「编程有料」 后台回复 c语言知识点可以获取与文章相关的思维导图哦 ~ ~