第一章 C语言基础
1. C语言编译过程
预处理:宏替换、条件编译、头文件包含、特殊符号
编译、优化:翻译并优化成等价的中间代码表示或汇编代码
汇编:生成目标文件,及与源程序等效的目标的机器语言代码,至少由代码段和数据段组成
链接:将有关的目标文件彼此相连接,分为静态链接和动态链接
2. 编码规范
适当的注释;
“{”和“}”独占一行并使一对对齐,“{}”之内的代码向右缩进4个空格;if、for、while等关键字后留一个空格再跟“(”,但函数紧跟;
“(”后向紧跟;“)”、“,”、“;”前向紧跟;
“,”后留空格;“;”不是一行结束时留空格;
二元操作符两边适当加空格,但单目运算符及“[ ]”、“.”、“->”要紧跟;
当一行代码太长时适当换行
3. 关键字
数据类型:int、char、float、double、short、long、void、signed、unsigned、enum(枚举类型)、struct(结构体)、union(联合体)、const(只读变量)、typedef(类型定义)、volatile(多为嵌入式开发用,说明这个变量可被隐含的改变,这样优化器在每次用这个变量时都会重新读取这个变量而不会使用寄存器里的值)
存储类别:auto(自动)、static(静态、内部)、register(寄存器)、extern(外部)
语句命令字:break(跳出switch和本层循环)、case、continue(跳出本次循环转入下一次循环的条件判断)、default、do、else、for、goto、if、renturn、switch、while
运算符:sizeof
4. 标识符
以字母或“_”开头,可以由字母、数字、“_”组成
5. 常量
常量后可以加“u”、“U”、“L”、“l”修饰;八进制数以“0”开头;十六进制以“0x”、“0X”开头;符号常量用单引号,字符串常量用双引号,并注意字符串常量所占空间为字符串长度加一字节
6. 数据类型
TC/Byte VC/Byte
[signed] int 2 4
unsigned [int] 2 4
[signed] short [int] 2 2
unsigned short [int] 2 2
[signed] long [int] 4 4
unsigned long [int] 4 4
float 4 4
double 8 8
char 1 1
signed char 1 1
unsigned char 1 1
typedef:typedef 类型名 新名 ,typedef在编译时执行而宏在预处理时执行
typedef声明数组类型:如typedef int arr[10],这样“arr a;”和“int a[10];”等效
枚举类型:
enum 枚举名
{
标识符[=符号常量],
……
标识符[=符号常量],
}[变量名];
共用体:
union 共用提名
{
数据类型 标识符;
……
数据类型 标识符;
}[变量名];
7. 变量的存储类型
局部变量:在函数中(包括main函数)或在复合语句中定义的变量,只在这个函数或复合语句中才起作用,形参属此类,也称内部变量
全局变量:在函数外定义的变量,在定义时候到本源文件结束起作用,若全局变量和局部变量重名(同一函数中变量不可同名,但不同函数可以),则局部变量起作用,同名全局变量暂不起作用
静态存储变量:存储在静态存储区,在编译时分配空间和赋初值,没有初值赋0,包括全局变量和局部静态变量(和自动变量对应,用static)
动态存储变量:存储在动态存储区,函数调用时分配空间和赋初值,没有初值则为随机数,包括形参和自动变量(定是局部变量,用auto)
第二章 运算符与表达式
1. 运算符的优先级
1:( ) [ ] -> .
2:! ~ ++ -- - + * & (类型符) sizeof (所有单目运算符)
3:* / %
4:+ -
5:<< >>
6:< <= > >=
7:== !=
8:&
9:^
10:|
11:&&
12:||
13:? :
14:= += -= *= /= %= >>= <<= &= |= ^= (所有赋值运算符)
15:,
其中只有赋值运算符、条件运算符(三目)、单目运算符是右结合
2. 表达式的值
赋值表达式:给变量赋的值
条件运算符:根据“?”前表达式选择“:”两边的一个表达式的值
逗号表达式:逗号分隔的最后一个表达式的值
第三章 函数
1. 内部、外部函数
用static可以声明(定义)内部函数,此种函数只能被同一源文件的函数调用,此时就不用担心与其他文件函数同名;用extern可以声明(定义)外部函数,其中extern可省
2. main函数的参数
main(int argc, char *argv[]),调用main时在命令行中输入“filename str1 str2……”,则argc为包括filename在内的参数个数,argv指向str1、str2 ……
第四章 指针
1. 指向字符串的指针
char *p=”Hello world.”; 中p指向字符串常量,并非把字符串赋给p指向的内存
2. 几种定义
int *p; 指向整型的指针
int (*p)[n]; 指向n长度一维数组的指针
int *p[n]; n长度指向整型的指针数组
int (*p)(); 指向函数的指针
int *p(); 整型指针型函数,函数返回值是整型指针
int **p; 二级指针,指向指向整型指针的指针,和指向一维数组的指针不同
3. “.”和“->”的区别
“.”是结构体或联合体用来调出成员的,与结构体变量或联合体变量一起用,而“->”和指向结构体变量或联合体变量的指针一起用,他们不能互换(加“*”时才可以)
4. const和指针
(const int *)和(int *)并非同一种类型,后者可自动类型转化到前者,前者不可自动类型转化到后者。注意(const int *)和(int * const)的区别,前者是指向常量的指针,后者为指向变量的常量指针。(const int *)变量不可通过解引用改变所指内容,但可以改变该变量的值。(int * const)变量不可改变,但可以改变所指内容。通常将函数参数声明成const型或指向cosnt指针,避免改变参数的值或它所指的值。
第五章 预处理
1. 预处理的功能
宏定义、文件包含、条件编译,都带有“#”
2. 实例
#define,宏定义,带参数时注意加“()”,和#undef配合
#include,文件包含,接“<>”时表示只在标准库中查找,接“”””时,先在当前目录找找不到再到标准库
#if ……
……
#elif
……
#else
……
#edif
#ifdef:当被宏定义时
#ifndef:当未被宏定义时
#line:#line 行号 [“文件名”]
#pragma:参数为下面三种
message,在编译信息输出窗口中输出相应信息
code,设置程序中函数代码存放的代码段
once,保证头文件被编译一次
3. 特殊宏定义
__LINE__、__FILE__、__DATE__、__TIME__、__STDC__、__cplusplus 等
第六章 常用算法
1. 排序
2. 查找
3. 数据压缩
参考文献
C 语言开发实战宝典/ 刘彬彬,李伟明等编著. —北京:清华大学出版社,2011.1
C 语言程序设计教程/ 李玲,桂玮珍,刘莲英编著. —北京:人民邮电出版社,2005.2
C函数速查手册/ 尹德淳编著. —北京:人民邮电出版社,2009.4
C 语言高级程序设计/ 陈天洲编著. —北京:人民邮电出版社,2002.12
C语言算法速查手册/ 程晓旭等编著. —北京:人民邮电出版社,2009.10
C语言编程之道/ 刘彬彬,孙秀梅,李鑫编著. —北京:人民邮电出版社,2011.3