导图社区 二级C语言知识导图
二级C语言考点总结、快速掌握考试要点、复习抓住重点!下图讲述了C语言的C程序初识、C程序结构、函数、数据类型、作用域和存储类型、预处理、文件操作。
编辑于2020-01-31 03:26:44C语言
C程序初识
计算机基本运行原理
http://www.cnblogs.com/kzloser/articles/2559004.html 
硬件系统
运算器、控制器、输入、输出、存储器
软件系统
系统软件、应用软件、辅助软件
分层结构
http://www.softwarehistory.net/categoryA/hardware/JisuanjiXitongFenceng.php
由下层向上层提供服务
程序设计基本概念
程序和程序设计
计算机程序,是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。同一计算机程序的源程序和目标程序为同一作品。 程序设计是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。程序设计往往以某种程序设计语言为工具,给出这种语言下的程序。程序设计过程应当包括分析、设计、编码、测试、排错等不同阶段。专业的程序设计人员常被称为程序员。
程序:指令序列
程序设计:解决问题的过程
算法
算法是指为解决一个特定问题而采取的确定且有限的步骤 有五个要素 1、有穷性 2、确定性 3、可行性 4、零或多个输入 5、一个或多个输出 
一般流程图
由基本图形构成
N-S流程图
都在一个矩形里
有穷性、可行性、确定性,>=0输入、>=1输出
结构化和模块化设计
任何复杂的算法,都可以由顺序结构、选择(分支)结构和循环结构三种基本结构组成 模块化: 模块化程序设计即模块化设计,简单地说就是程序的编写不是开始就逐条录入计算机语句和指令,而是首先用主程序、子程序、子过程等框架把软件的主要结构和流程描述出来,并定义和调试好各个框架之间的输入、输出链接关系。逐步求精的结果是得到一系列以功能块为单位的算法描述。以功能块为单位进行程序设计,实现其求解算法的方法称为模块化。模块化的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化。 顺序结构:顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的。 选择结构:选择结构表示程序的处理步骤出现了分支,它需要根据某一特定的条件选择其中的一个分支执行。选择结构有单选择、双选择和多选择三种形式。 循环结构:循环结构表示程序反复执行某个或某些操作,直到某条件为假(或为真)时才可终止循环。
c程序构成和格式
标示符
平时,我们指定某个东西、人,都要用到它,他或她的名字;在数学中解方程时,我们也常常用到这样或那样的变量名或函数名。同样的道理:在编程语言中,是用户编程时使用的名字,对于变量、常量、函数、语句块也有名字,我们统统称之为标识符。 常量:指在程序运行过程中,其值不可改变的量.与变量不同,常量没有名称,由于常量同样要存储,所以其有地址. 变量:计算机程序中的变量是指 在程序的运行过程中随时可以发生变化的量。 关键字:是程序语言里事先定义的,有特别意义的标识符,有时又叫保留字。 标示符:关键字,预定义标示符,用户标示符
关键字
预定义标示符
用户自定义标示符
字母、数字、下划线
不能以数字开头
变量、常量
数据类型
数据的分类 用来约束数据的解释
表达式和语句、注释
表达式是可以被求值的代码,而语句是一段可执行代码。 语句是执行一个动作,表达式是返回一个值 表达式是操作符、操作数和标点符号组成的序列,其目的是用来说明某个计算过程 1. 表达式有值,语句没有值, 能作为函数参数即为表达式,否则为语句。 2. C语言中的控制结构为语句。 3. 函数式语言中的所有东西都有值, 都是表达式 "表达式"(expression)是一个单纯的运算过程,总是有返回值; "语句"(statement)是执行某种操作,没有返回值。 表达式,是由数字、算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。 注释:对代码的说明文字/**/
表达式
通过赋值运算符"="将一个值存入一个变量的表达式叫赋值表达 复合赋值表达 += -= 先使用变量自身做其他运算操作,然后的在赋值 -- ++ 自增自减 对变量自身的值增加或减去1 逗号运算符和逗号表达式 使用逗号“,”将表达式连接在一起的表达式 从左向右结合
表达计算的过程
赋值表达式
算数表达式
关系表达式
逗号表达式
语句
C语言执行的语法单位
表达式语句、控制语句、复合语句、函数调用和空语句
//和 /* */
运算符
运算符是告诉编译程序执行特定算术或逻辑操作的符号。 对数据做处理的一种符号
对数据做处理的一种符号
优先级、结合性
括号,单目的优先级高
预处理命令
在生成可执行程序前,又预处理器对源程序(源代码)处理的命令 #include #define 等
include
define
函数
主函数
只能有一个
main(void)、main(int argc, char** argv)
库函数
C函数库提供的函数
自定义函数
VC++6.0基本使用
编译、连接、运行和调试过程
编译:把源程序转化为二进制的机器命令 .obj 链接:把目标文件和需要的各种函数库链接起来生成一个.exe的可执行文件 http://smilejay.com/2012/01/c_compilation_stages/ 编译链接详细说明 cl /P 生成预处理后的结果 cl /FA 生成汇编 代码
基本操作
创建工程 创建文件 编译 执行 调试
C程序结构
顺序结构
概念
语句的顺要按逻辑顺序出现去执行
输入输出
printf
%d %f %e %g %s %c %g %x %o %p
宽度和小数点保留
转义字符 \n \b \t ,\\ ,\" %%
scanf
%d %c %f %lf %e %s %o %x
lf(double) f (float)一定要区分
输入要按格式控制里原样输入
选择结构
关系运算符和逻辑运算符
>、 <、 >=、 <=、 ==、 !=
&&、||、!
注意短路
优先级
逻辑值
真为非零(1)
假为零(0)
if语句
三种形式:if()、if ...else...、if...else if...else...
if嵌套语句
其后的语句替换为if语句,或者复合语句中嵌入if语句
注意点
复合语句必须要{} 后不跟分号";"
else总是与最近的if匹配
条件运算表达式 ?:
优先级较低,注意使用括号
由表达式一决定表达式的值为二还是三
switch
case 只能在switch里
要结束swith需要break
default可以出现在任何位置
goto语句
需要一个跳转标签
不能跨函数,一般不建议使用
循环结构
概念
循环结构:具有重复执行某段程序的功能 循环结构的三个要素:循环变量、循环体和循环终止条件
具有重复执行某段程序的功能
循环变量、循环体和循环终止条件
while、do...while
do...while之后有分号
while有可能一次都不执行
do...while先执行一次
for语句
三个表达式执行流程
表达式可以省略但分号不能少
第二个表示的值决定循环是否继续
表示是任意表达式,不一定好和循环变量有关
break、continue
break终止循环
continue 结束本次循环,不影响循环次数
函数
概念
一段完成特定功能可重复使用的代码片段
函数库
C语言标准库
系统库
第三方库
库函数
pow、sqrt、abs、fabs、sin、cos、isalpha、isdigit、strlen、rand
定义和返回值
定义说明部分必须在前面
return 返回值
一个返回值或着没有返回值
定义时的返回类型相同
缺省的返回类型是int
return 将结束函数调用
定义
不能嵌套定义
类型 函数名(类型 参数名,。。。。){}
调用
void 类型只能单语句调用
非void 可用作表达式和单语句调用
返回值直接参加运算
做函数参数
形参实参
函数的调用
之前要声明
函数首部加分号
省略形参名
省略参数列表
参数的个数和数据类型要对应
不匹配会自动转为形参的类型
个数也相等
实参只能是表达式
不能有类型名
传参方式
传值
是一个非地址的值
传址
值是一个地址而已
单向传递
把实参值赋值给形参
概念
形参:定义时的参数
实参:调用时传入的实际参数,必须是一个值
递归函数
递归漫谈,斐波拉契 http://www.nowamagic.net/librarys/veda/detail/2325
自身直接或间接地调用自己
退出条件
效率不高、理解复杂、不建议使用
main函数
唯一,程序的开始
两种形式
int main(void)
int main(int agrc,char *agrv[])
通过命令行传入参数
argc参数个数、argv参数字符串列表
数据类型
为什么要有数据结构这个东东? 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存(光盘、硬盘、U盘……)或内存(ROM、RAM、SRAM……)里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。 VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单! 指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。” 提醒: “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 (Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 想要从本质上理解C指针,必须学习C和汇编的对应关系。” 不是一回事! 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 不要写连自己也预测不了结果的代码!
概念
数据类型(Data type)是用来约束数据的解释
决定了在内存中字节数和能对其做的操作
基本类型
整型
首先可以确定的告诉你,C/C++的标准中,从来没有规定1byte等于8bit。它只规定了:sizeof(char) = 1,除此之外,还有一项相关的规定就是:sizeof(char) 但是现实中,1byte确实绝大部分都是8bit的。其源头是tcp/ip协议中,有这样的规定。 所以,除非你做的系统不准备支持tcp/ip协议,否则,依循它的协议,使用1byte=8bit是最简单的。 http://www.guokr.com/question/171542/ 字节 http://en.wikipedia.org/wiki/Byte
int 、short int、unsigned、signed、long
正负数、取值范围、进制
特有操作
位运算
&、~、^、|、>>、<<
%求余
浮点型
float 、double
float 7位有效数字
double 15位有效数字
精度、科学计数、取值范围
输入float%f、double%lf
字符型
char 'A'、65、'\101'、'\041'、\x61
ASCII字符编码
getchar、putchar
操作
加减乘除
+、-、*、/、++、--
前++、--
后++、--
类型转换
四舍五入
混合运算低精度向高精度转化
输出输入
%d %p %c %s %f %lf %X %o %g %e %u
赋值操作
=
复合赋值 %= += -=
数据长度
char<= short <= int<= long
sizeof(x)可以定义数组
char=1,short =2、int=4,long=4
类型转换
强制类型转换(int)
自动转换
赋值、混合运算、函数传参、输出转换
char->short->int ->unsigned -> float -> double
构造类型
数组
概念
一组空间上连续类型相同的变量
一维数组
定义:类型 数组名[整型常量表达式]
'A'、50、sizeof(int)、10+5
二维数组
数组的数组
一维数组中每个元素又是一个一维数组
定义:类型 组名[整型常量表达式][整型常量表达式]
操作
初始化
在花括号中逐个初始化
部分初始化
其余部分默认为零
初始化确定定义数组元素个数
引用
取一组元素中的某一个访问
数组名[0<=x<N]
做函数参数
地址传给形参
数组名是首元素地址
元素地址
int *p、int p[]、int p[N]形参实质都是指针
结构体共同体
概念
定义
struct、union
在花括号中定义成员变量
结尾要有分号
typedef给类型声明一个新的名字
成员(属性)
可以是任何类型
有一个指向自身类型的指针的叫自引用
用于构成链表
操作
初始化
花括号中逐个初始化
只初始化部分、其他默认为零
成员变量
.点成员运算符
->指针成员
(*).取值再取成员变量
变量之间直接赋值
类型相同、成员变量对应赋值
类型不同、不能转换则错误
链表
用一个指向自身类型的指针将节点连接起来
创建、删除、插入、遍历、销毁
区别与联系
结构体所以成员都分配内存
共同体只有一个存在、分配成员变量最大的空间
做函数参数
成员是指针,只是传入地址值
字符串
概念
字符数组中用0表示字符串结尾
0 和 '\0'是一样的
字符串常量
值是首元素地址
存放在静态常量区
使用字符数组存放
gets、puts %s strcpy、strcmp、strcat、strlen等相关函数
字符串数组
二维数组
字符指针数组
指针
概念
内存的地址叫指针
保存指针的变量叫指针变量,一般也叫指针
变量的第一个字节作为变量的地址
指针变量的值是其他变量的地址
操作
& 取址、*取值
移位+、-
移动一个类型的字节
两个指针只能相减
和数组关系
数组名和数组首元素地址
数组名类似与一个指针常量
数组名是一个值不能改变
指针变量是变量可以改变
指针操作数组
*(prt+n) <=> prt[n]
二级指针不对应二维数组
*(*(a+m)+n)=a[m][n]
**ptr = a[][]不正确
数组指针与指针数组
指针数组int *p[N]
一组指针变量
数组指针int (*p)[N]
指向数组的一个指针变量
和函数关系
参数传址
数组名做参数
通过参数返回数据
返回指针
不能是指向函数内临时变量的地址
函数指针
函数名是函数的入口地址
指向函数的指针
main函数
argv是一个字符指针数组
动态存储分配
malloc、alloc、realloc、free
在堆上分配,需要程序手动释放
无值类型void
函数无返回值
函数无参数
指针无类型
作用域和存储类型
作用域
标示符起作用的区域
局部、全局
生存周期
变量在程序中占据内存是时期
动态、静态
静态变量只初始化一次,默认为零
常用限定符
static、register、const、auto、extern
extern声明变量、扩大作用域
static、缩小作用域
预处理
概念
宏替换#define
带参、不带参
简单替换
()保证替换后不会错误
文件包含#include
宏编译#if...#endif
文件操作
概念
外部介质上的数据集合
直接存取、顺序存取
文本文件、二进制文件
读写操作
操作标示
r、w、a、t、b、+
SEEK_SET、SEEK_END、SEEK_END
相关函数
fopen、fclose、feof、fread、fwrite、ftell、fseek、rewind
getc(fgetc)、putc(fputc)、fgets、fputs、fprintf、fscanf
步骤
文件指针、打开文件、读写文件、文件定位、关闭文件
要注意文件判断文件是否打开成功