程序 = 数据结构 + 算法
程序:一组计算机能识别和执行的指令,每一条指令使计算机执行特定的操作。一个程序由一个或多个源程序文件组成。程序最根本的功能是对数据的处理,还需要对数据处理的过程进行控制。
数据结构:对数据的描述,在程序中要指定用到哪些数据,以及这些数据的类型和数据的组织形式。
算法:对操作的描述,要求计算机进行操作的步骤。
有效算法的特点(判断算法有效的条件):
- 有穷性: 一个算法应包含有限的操作步骤,而不能是无限的。
- 确定性: 算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。
- 有零个或多个输入: 输入是指在执行算法时需要从外界取得必要的信息。
- 有一个或多个输出: 算法的目的是为了求解,输出就是解。
- 有效性: 算法中的每一个步骤都应当能有效的执行,并得到确定的结果。
结构化算法:由三种基本控制结构组成的算法结构。
程序的三种基本控制结构:顺序结构、分支结构、循环结构。
结构化程序:用计算机语言表示的结构化算法。
结构化程序设计方法:
- 自顶向下
- 逐步细化
- 模块化设计
- 结构化编程
语言
机器指令:计算机能直接识别和接受的二进制代码。
机器语言:机器指令的集合。
汇编程序:一种把符号语言(汇编语言)的指令转换为机器指令的软件。
编译程序(编译器):一种把高级语言写的程序(源程序)转换为机器指令的程序(目标程序)的软件。
编译:利用编译程序从源程序产生目标程序的过程。
可执行程序:程序编译后经过(连接编辑程序)处理生成的一个可供计算机执行的目标程序。
程序与源程序:一个程序由一个或多个源程序文件组成。一个源程序文件由一个或多个函数以及其他有关内容(如指令、数据声明与定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。
函数
函数:函数就是功能,每一个函数用来实现一个特定的功能,函数的名字应该反映其代表的功能。函数是C程序的主要组成部分,是C语言的一种子程序。主函数也是函数之一。
函数声明的作用:函数声明的作用是把有关函数的信息(函数名、函数类型、函数参数的个数与类型)通知编译系统,以便在遇到函数调用时,编译系统能正确识别函数并检查调用是否合法。
实参和形参:在函数调用时,实参变量将它的值传递给形参变量(值传递),实参和形参在内存中占有不同的存储单元,函数调用结束后,形参存储空间被释放。由于单向值传递的特性,形参值的改变不能使实参的值随之改变。
语句
语句:语句是程序最基本的执行单位,程序的功能就是通过执行一系列语句来实现的。
标识符:一些用来对变量、符号常量名、函数、数据类型等命名的有效字符序列,简单地说,标识符就是一个对象的名字。由字母、数字和下划线组成,其中第一个字符必须是字母或下划线。
if-else语句:C语言只有 if-else 分支语句,而没有 if-(else if)-else 这种形式。一般我们使用的 else if 实质上是在 else 里嵌套了一个 if 。if 与紧跟其后的 else 处于同一级别。
数据
常量:在程序运行过程中,其值不能被改变的量。
变量:在程序运行过程中,其值可以改变的量。
循环控制变量:通过改变和判断某个变量的值来控制循环的执行,这样的变量被称为循环控制变量。
常变量:在定义变量时,前面加一个关键字 const,在变量存在期间其值不能改变。
符号常量:使用#define指令,指定用一个符号名称代表一个常量,称为符号常量。在预编译后,符号常量会全部变成字面常量。
全局声明:即在函数之外进行的数据声明。
全局变量:在函数外面定义声明的变量称为全局变量。在整个源程序文件范围内有效。约定俗成,全局变量名的第一个字母用大写表示。全局变量不赋初值则系统自动赋值为 0。
局部变量:在函数中定义声明的变量是局部变量,只在函数范围内有效。局部变量不赋初值会报错。
作用域:如果一个变量在某个文件或函数范围内是有效的,就称该范围为该变量的作用域。
数据类型:所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式,不同的类型分配不同的长度和存储形式。
数组:一组有序数据的集合,数组中的每一个元素都属于同一种数据类型。数组名代表着该数组第一个元素的地址,或者说数组的起始地址。
字符数组:C语言没有字符串类型,也没有字符串变量,字符串是存放在字符型数组中的。用来存放字符数据的数组是字符数组。由于字符型数据是以整数形式(ASCII码)存放的,因此也可以用整型数组来存放字符数据,这么做虽然合法但会浪费存储空间。
字符串:字符串不是变量,而是一个常量。在C语言中只有字符变量,没有字符串变量。
结构体:由不同类型数据组成的组合型数据结构。
声明与定义:把建立存储空间的声明称定义,把不需要建立存储空间的声明称为声明(或引用)。所谓声明,其作用是表明该变量是一个已在其他地方定义过的变量,仅仅是为了扩展该变量的作用范围而作的“声明”。
运算
运算符:运算符表示对各种数据类型数据对象的运算。
表达式:运算符与运算对象(可以是常量、函数、变量等)的有意义组合就形成了表达式。
算术表达式:用算术运算符和括号将运算对象(操作数)连接起来的,符合编程语言语法规则的式子称为算数表达式。
关系表达式:用关系运算符将两个数值或数值表达式连接起来的式子,称为关系表达式。关系表达式的值是一个逻辑值,只有两种结果即“真”与“假”,在C语言的逻辑运算中,以数值1代表真,以数值0代表假。
逻辑表达式:用逻辑运算符将关系表达式或其他逻辑量连接起来的式子就是逻辑表达式。逻辑表达式只有两种结果即“真”与“假”,在C语言的逻辑运算中,以数值1代表真,以数值0代表假。
左值:左值的意思是它可以出现在赋值运算符左侧,它的值是可以改变的。并不是任何形式的数据都可以作为左值,左值应当为存储空间并可以被赋值。
右值:能出现在赋值运算符右侧的表达式称为右值。左值也可以出现在赋值运算符右侧,因而凡是左值都可以作为右值。
关系运算符及其优先次序:
- <, <=, >, >= 的优先级别相同,== 与 != 的优先级别相同。但前四种的优先级高于后两种。
- 关系运算符的优先级低于算术运算符( +, -, *, /, % )。
- 关系运算符的优先级高于赋值运算符( = )。
逻辑运算符及其优先次序:
- !(非)大于 &&(与)大于 ||(或)。
- && 和 || 低于关系运算符,! 高于算术运算符。
指针
-
指针就是地址
- 指针变量是存放地址的变量,也可以说,指针变量是存放指针的变量。
- 指针变量的值是一个地址,也可以说,指针变量的值是一个指针。
- 指针变量也可称为地址变量,它的值是地址。
- & 是取地址运算符,&a 是 a 的地址,也可以说,&是取指针运算符。&a是变量a的指针(即指向变量a的指针)。
- 数组名是一个地址,是数组首元素的地址;也可以说,数组名是一个指针,是数组首元素的指针。
- 函数名是一个指针(指向函数代码区的首字节),也可以说函数名是一个地址(函数代码区首字节的地址)。
- 函数的实参如果是数组名,传递给形参的是一个地址,也可以说,传递给形参的是一个指针。
-
指针是有类型的 C语言所有的数据都是有类型的,地址也是有类型的,按照指针型数据的存储方式存储,不同于整型或浮点型的存储方式。 一个地址型(指针型)数据包含三个信息:
- 表示内存编号的纯地址
- 它本身的类型,即指针类型
- 以它为标识的存储单元中存放的是什么类型的数据,即基类型。
void* 指针是一种特殊的指针,不指向任何类型的数据。如果需要用此地址指向某类型的数据,应先对地址进行类型转换。(手动显式转换,系统隐式转换)
-
指针与指针变量 指针就是地址,而指针变量是用来存放地址的变量,指针变量的值是一个地址。 -
什么是指向 地址就意味着指向,因为通过地址就能找到具有该地址的对象。对于指针变量来说,把谁的地址存放在指针变量中,就说此指针变量指向谁。(前提:只有与指针变量的基类型相同的数据,它的地址才能存放在相应的指针变量中。) -
指针变量的归纳比较
变量定义 | 类型表示 | 含义 |
---|
int i; | int | 定义整型变量 i | int* p; | int* | 定义 p 为指向整型数据的指针变量 | int a[5]; | int [5] | 定义整型数组 a,它有 5 个元素 | int* p[5]; | int* [5] | 定义指针数组 p,它由 5 个指向整型数据的指针元素组成 | int(*p)[5]; | int(*)[5] | p 为指向包含 5 个元素的一维数组的指针变量 | int f( ); | int( ) | f 为返回整型函数值的函数 | int* p( ); | int* ( ) | p 为返回一个指针的函数,该指针指向整型数据 | int(*p)( ); | int(*)( ) | p 为指向函数的指针,该函数返回一个整型值 | int** p; | int** | p 是一个指针变量,它指向 一个指向整型数据的指针变量 | void* p; | void* | p 是一个指针变量,基类型为 void(空类型),不指向具体的对象 |
一些链接:
C语言数据类型转换规则(隐式转换+显式转换)
C语言字符串的一些使用注意事项
C语言变量的存储方式和生存期
C语言自定义函数的一些注意事项
C语言指针的一些易错点
|