------期待与您交流! -------
一、预处理指令
1. 预处理指令是在代码编译成0和1之前执行的
2. 预处理指令的位置是随便写的
3. 预处理指令都是以#开头的
4. 预处理指令的作用域:从编写指令的那一行开始,一直到文件结尾
5. 预处理指令分为三种:宏定义,条件编译,文件包含
二、宏定义(#define 宏名 值)
1. #define COUNT 5 (宏名一般用大写,变量名一般都用小写)
把所有的COUNT替换成5
2. 例外:“”(双引号)之内的COUNT不会被替换
3. 若想宏不生效,则在该处定义一个#undef COUNT取消宏定义的作用
4. 带参数的宏
#define sum(v1,v2)((v1)+(v2) ) // 用((v1)+(v2) )替换(v1,v2)
5. 带参数的宏定义比函数效率高
6. 宏定义只是文本替换
三、条件编译(有条件的编译某段代码)
1. 格式
# define A 10 //定义一个宏(因为宏是预处理指令,预处理指令是在编译之前才执行的)
# if (条件) //条件判断宏的值
{
}
#elif()
{
}
#else
{
}
#end if
只编译条件成立的这一句,其他的不编译
2. 如果定义了一个宏:#if defined(A) 或者 #ifdef A
如果没有定义一个宏:#if !defined(A) 或者 #ifndef A
3. 使用了条件编译时,只要写了#if ,在最后面就必须写上#endif
四、文件包含(#include)
1. #include <> 表示系统自带的文件
#include" " 表示自定义的文件
2. #include不允许循环包含(a.h包含b.h,b.h包含a.h 这样是不可以的)
五、typedef(类型)
1. typedef int MyInt //给int起了个别名MyInt,实际MyInt就是int
typedef char* string //给指针起了个别名string 实际string就是char*
typedef struct student {int age;}mystu;或者typedef struct student mystu; //给结构体起了一个新名称
typedef int(*test)(int,int) //给指向函数的指针定义一个新类型,新类型的名称为(*test)
2. typedef的作用:给已经存在的类型起一个新的名称
3. 使用场合:基本数据类型,指针,结构体,枚举,指向函数的指针
4. 使用注意
#define string2 char*
typedef char *string
int main()
{
string s1,s2 //s1,s2是指针
string2 s3,s4 //s3是char*指针 ,s4是个char
}
六、static和extern
1. 对函数的作用
(1)用来完整的定义和声明一个外部函数(定义的文件能被本文件和其它文件访问)
extern void test() // 默认情况下,所以函数都是外部函数,external可省略
(2)用来完整的定义和声明一个内部函数(定义的文件只能能被本文件访问,其它文件不能访问)
static void test2() //static不可省略,而且内部函数只能间接调用
(3)外部函数不能同名,内部函数在不同文件中,允许同名
2. 对全局变量的作用
(1)全局变量可分为外部变量和内部变量
外部变量:定义的变量能被本文件和其它文件访问
内部变量:定义的文件只能被本文件访问和其它文件不可访问
(2)默认情况下,所有外部变了都是全局变量
(3)不同文件中的同名外部变量都代表同一个变量,不同文件中的同名内部变量,互不影响
(4)static对变量的作用:定义一个内部变量
extern对变量的作用:声明一个外部变量
3. 对局部变量的作用:
1>static修饰局部变量:(1)延长局部变量的声明周期,程序结束时,局部变量才会被销毁
(2)并不会改变局部变量的作用域
2> 使用场合: (1)如果某个函数的调用频率特别高
(2)这个函数的某个变量值是固定不变的
七、递归思想(用在函数中)
递归的两个条件:(1)函数自己调用自己
(2)必须有明确的返回值
补充:C语言中的null相当于0,p=null(清空指针)