目录
预处理
gcc常用选项列表
-c 只编译不链接,生成目标文件
-S 只编译不汇编,生成汇编代码
-E 只进行预编译,不做其他处理
-g 在可执行程序中包含标准提示信息
-n file 将file文件指定为输出文件
预处理指令
gcc -E file.c -o hello.i
编译指令
gcc -S file.c -o hello.s
汇编指令
gcc -c file.c -o hello.i
*.c——源文件
*.i——预处理文件
*.s——汇编文件
*.o——目标文件
编译过程
1.预处理(预编译)
作用:将代码中相关预处理命令执行,最终生成出一个只包含C语言代码的文件
2.编译
作用:对语法进行检查,将这个c的源代码生成汇编代码
3.汇编
作用:将汇编源代码最终生成机器语言
4.链接
作用:将使用到的其他代码链接到一起,生成最终可执行文件
c提供的预处理功能
(最终效果做文本替换)
1.宏定义
语法:#define 标识符 字符串 = #denfine 宏名 宏值
#define HONG 10
注意:
(1)预处理命令都是以#开头的;
(2)宏名命名规则和之前标识符命名规则一致,宏名一般写大写,以区别与普通变量名
(3)预处理实际上是将“宏名”用宏值(预处理阶段的字符串)原样输出(文本替换);
(4)应用:1.提高代码可读性;2.一改全改,方便代码修改
(5)宏名的作用域
注意:只是在预处理阶段发挥作用。
作用范围:从定义处开始到#undef(#undef 宏名 取消宏名的定义)结束,如果没加#undef,会一直到程序结束。
带参数的宏定义
语法:#define 宏名(参数)宏值
#define ADD(a+b) a+b
1.带参宏和函数本质的区别
(1)处理阶段不一样
宏定义是预处理阶段;函数是编译阶段
(2)使用不一样
宏是预处理阶段就使用结束
宏的使用,本质上是文本的原样替换;它的参数只是进行文本替换用,不进行语法检查,不能带类型符号。
函数是调用时进行使用
函数的使用本质上是函数代码的调用;参数是有类型的,编译阶段是进行类型检查的。
应用:
一般对于一些短小代码(一般不超过5行的代码),考虑写成带参宏。
带参宏的副作用
#define APP(a,b) a*b
printf("a*b = %d",APP(2+3,4+5));
此时APP里的运算为2+3*4+5
处理:把能加括号的地方都加括号
注意:宏定义必须写到一行中或着使用续行符,在每行后面加上\,并且其后面不能有空格符
2.文件包含
#incldue<文件名>
#include"文件名"
<>与" " 区别
在于查找头文件的方式不一样
<>表示到系统默认路径寻找对应的头文件;
" "表示先到当前目录下寻找头文件,如果没有,再到系统默认路径寻找;
3.条件编译
(1)
#ifdef 标识符
程序段1
#else
程序段2
#endif
含义:如果定义了标识符,则预处理程序段1(就是将程序段1的代码保留),否则保留程序段2
用途:1.调试代码;2.设计头文件
(2)
#ifndef 标识符
程序段1
#else
程序段2
#endif
含义:如果没有定义,则预处理程序段1,否则处理程序段2
(3)
#if 表达式(判断真假)
程序段1
#else
程序段2
#endif
含义:表达式为真处理程序段1,表达式为假处理程序段2
指针基础
指针概念
指针就是地址,地址就是数据在内存单元的编号
当指针为a时,指的是指针变量;当指针为0x1000时,指针指的是地址
指针也是一种数据类型,指针类型是专门来处理地址这种数据的;
指针变量
语法:基类型 *指针变量名
基类型
整型,浮点型,字符型,数据类型,指针类型,结构体类型,函数类型;
作用:用来表示这个指针类型指向的内存空间存放的是什么类型的数据;
*
定义的时候,表示此时定义的是一个指针类型的变量;
指针变量名
符号标识符命名的规则
int a = 10; //a所在的空间是用来存放int类型的数据的
int *p = &a; //此时p指向了a
&a表示获得a所在空间的首地址;表示获得了一块可以存放int类型的内存空间地址。
指针类型
int *p;
(int *)就是指针类型
int * p 它首先表示的是一个指针类型,然后再表示指向int型数据的指针类型。
指针变量的引用
int a=10;
int *p = &a; //p指向a,因为保存了a的地址
*是指针运算符,也是单目运算符,它的运算对象只能是指针(地址);
*p表示访问p所执行的基类型的内存空间
*p间接访问;通过a访问的是直接访问
访问步骤:1.首先拿出p中地址,到内存中定位;2.偏移出sizeof(基类型)大小的一块空间;
3.将偏移出的这块空间,当做一个基类型来看(*p运算完的效果)
*p运算效果就相当于是一个基类型的变量,整体等价来看*p等价于a。