一、register
作用:请求编译器尽可能的将变量存在CPU内部寄存器中,一般的变量存在内存中,当需要时CPU再从内存中把它抓取到CPU中,使用register把它存在CPU中省去了CPU从内存中抓取数据的时间,提高运行效率。
注意:1、尽可能,因为CPU内存有限,不可能全放在里面,一般把频繁使用的变量放在里面,如循环变量。
2、register只能修饰局部变量,不能修饰 全局变量和函数。
3、register修饰的变量不能使用取地址符获取地址,因为它保存在CPU里,不在内存中。
4、register修饰的变量一定是CPU接受的类型。
二、static
static既能修饰变量也能修饰函数,修饰的数据保存在全局数据区的静态数据区。
作用:1、被static修饰的局部变量,延长了生存周期,程序结束后才会释放。
2、被static修饰的全局变量,只能在本文件中使用,不能在其它文件中访问。
3、被static修饰的函数,只能在本文件中调用,不能被其它文件调用。
三、extern
作用:外部声明,调用在其它文件中定义的变量。
使用形式:extern int num 声明要加类型。
四、const
作用:修饰一个变量变为只读,通常用作函数形参。
例:
const num = 5;
不能再通过变量名去修改num对应空间的值,但通过其他方法还是可以修改的。
如:
int *p = #
(*p)++;
例:
const int *p = #
三个运算
1、num++;
2、p++;
3、(*p)++;
解:3式可以成功,1、2两式不能成功。const向右距离*p最近,所以*p是可以修改的。
五、typedef
作用:重定义
特殊:定义函数指针
typedef int(*P_FUN)(int);
P_FUN p_func;
六、volatile
七、define
作用:定义宏。
特殊:
函数式宏定义:#define MAX(a,b) a > b ? a : b
宏函数与自定义函数区别:
宏的执行速度快,省去了分配空间和释放栈帧、传参、传返回值等一系列操作,适用于简短且被频繁调用的函数,是以编译时间换空间的典例。
#ifndef
#define
#endif
可以防止因头文件相互包含带来的重复定义。