static:
1)如果static修饰一个函数体内的变量则在调用过程中其值不会被改变
2)如果static修饰一个变量(在模块中但不在函数体内)或函数,则这个变量或函数只在该模块中能被调用,不能被其他模块的函数调用
const:
简单来说const关键字的作用是“只读”
1)被const修饰的变量的值不可改变
const int a;
int const a;
都表示a的值不能被改变
2)const修饰指针有三种情况
a、const int *a;
此时a这个指针指向的地址中的值不能被改变,
此处注意:const int *a与int const *a是等价的
b、int * const a;
此时指针a的指针名不能被改变但内容可以被改变
c、const int const *a;
此时指针以及指针所指向的内容都不会被改变
volatile:
使用volatile修饰的变量意味着这个变量可能会被意想不到的改变,也就是说此时被备份放在寄存器中的值不一定是准确的,所以每当优化器用到这个值时都会小心的重新读取。因此被volatile修饰的变量是不会被编译器优化的
建议使用volatile的场所:
1)并行设备的硬件寄存器
2)一个中断服务子程序会访问到的非自动变量(全局变量)
3)多线程任务中被几个任务共享的变量