1、register关键字
请求编译器尽可能的将变量保存在CPU内部寄存器中,省去CPU从内存中抓取变量的时间,提高了运行效率。
为什么是尽可能而不是全部将变量保存在CPU中:由于CPU内部寄存器中空间有限,不可能将所有变量都放入其中,所以只能将一些经常访问的变量放入。
使用注意事项:①register只能修饰局部变量,不能修饰全局变量和函数。全局变量会被多个进程访问,如果只有当前进程用register修饰,那么只有当前进程知道被register 修饰的变量保存在哪里。
②不能用取地址来获取变量的地址,因为这个变量是保存在寄存器中的,取地址获取的是内存的地址
③register修饰的变量一定是CPU可以接受的变量
2、Static关键字
staticke可以修饰变量和函数,⑴static在修饰变量时,既可以修饰局部变量又可以修饰全局变量
①在修饰局部变量时是在延长他的生命周期,在程序整体运行结束时在释放
②在修饰全局变量时,该变量只能在本文件中被访问,其他文件中不可以访问
⑵static修饰的函数与全局变量类似,只能在本文件中被调用,其他文件不可以调用。Static修饰的变量保存在数据区的静态数据区,若没有
进行初始化,则初始化默认为0
什么时候用static关键字:当你想要将一个变量在程序执行完成后释放,可以使用static修饰,用全局变量就比较危险,因为其它函数也可以进行操作,而用static修饰的变
量只有该函数自己可以操作,起到保护的作用
3、Const关键字
const修饰的是只读变量,不可以通过该变量名来修改里面的内容,但是可以通过该空间修改里面的内容。因此可以总结出一句话:const离谁近,谁不可以做改变。使
用const修饰变量时,一定要对变量进行初始化。且const一般用在修饰函数形参,避免在函数运行过程中修改实参的值。
例:const int num = 5;
int *p = #
(*p)++; //正确
num++; //错误表达,因为const离num近,所以不可以做改变
4、Extern关键字
这是一个申明变量,申明这个变量时在其他文件定义的,但是要加申明的类型,而且,extern只能申明全局变量,在函数内部的局部变量不可访问
5、Typedef关键字
给变量重起名字,提高代码的移植性,可以使复杂的变量名变成简单的变量名,提高编写效率,起到对变量的注释的作用
6、Volatile关键字
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关
键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
一般说来,volatile用在如下的几个地方:
①中断服务程序中修改的供其它程序检测的变量需要加volatile
②多任务环境下各任务间共享的标志应该加volatile
③存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义
另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能
依靠硬件的良好设计了。
注:还有其他一些关键字后续会补充