编译过程:
1.预处理
预编译:执行代码中的预处理命令,生成一个只包含的.c文件
2.编译
对于语法进行检查,将c源代码变成汇编语言
3.汇编
将汇编代码生成机器代码
4.链接
将使用的代码链接到一起,最终生成可执行文件
宏定义:
#define 宏名 宏值
#define N 10
注意:
1.预处理命令都是以# 开头的
2.宏名和之前的命名规则一致
3.宏名一般大写,用来区分普通变量
4.预处理实际上是将宏名用宏值替换//文本替换5
c语言字符串中出现的“宏名”不会被替代
5.应用:
提高代码可读性
一改全改方便代码修改
6.作用域
# undef N //取消宏名的定义
发挥宏定义的作用范围从#define开始到#undef之间
带参宏定义://宏函数
语法:
#define 宏名(参数) 宏值
eg:#define ADD(a,b) a+b
注意:
带参宏和函数有本质的区别:
1.处理阶段不一样
宏定义:预处理阶段
函数:编译阶段
2.使用不一样
宏:预处理阶段就使用结束
宏的使用本质上是文本的原样替换
宏的参数,只进行文本替换,不进行语法检验
函数:调用时进行使用
函数的使用本质上是函数代码的调用
函数的参数是有类型的,编译阶段是要进行类型检查的
宏的应用
对于一般的简短代码,考虑写成带参宏(不需要保存现场,还原现场,优势劣势都有)
宏的副作用:
处理:
把能加括号的地方都加括号
\为续航符
文件包含
#include<文件名>
#include"文件名"
<> 与 ""的区别:
查找头文件的方式不一样
<>:到系统默认路径找头文件
"":先到当下目录下找,如果没有,再到系统默认路径找头文件
条件编译:
(1)#ifdef 标识符
程序段1
#else
程序段2
#endif
含义:
如果定义了标识符
则预处理程序段1//保留程序段1的代码
否则保留程序2
(2)ifndefine
程序段1
#else
程序段2
#endif
含义:
如果没定义了标识符
则预处理程序段1//保留程序段1的代码
否则保留程序2
(3)#if 表达式
程序段1
#else
程序段2
#endif
含义:
表达式为真保留程序段1,否则保留表达式2
用途:
调试的开关
指针:
指针就是地址,地址就是 内存单元的编号
指针也是一种数据类型,这种数据类型专门用来处理地址这种数据
语法:
基类型 * 指针变量名
1.基类型
整型...结构体类型,指针类型
表示指针指向的地址空间存放的是基类型的数据
2.*
表示此时定义的是一个指针数据类型变量
3.指针变量名
按照规则命名
指针变量的引用:
int a = 10;
int *p = &a;
* //指针运算符
//单目运算
//预算对象只能是指针(地址)
*p表示访问 p所指向的基类型的内存空间的内容
int a;
int *p;
*p = &a; //&a 的数据类型是 int *