一、volatile关键字
volatile作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次从内存中重新读值。可以保证对特殊地址的稳定访问。
应用场合:
(1)并行设备的硬件寄存器(状态寄存器);
(2)一个中断服务子程序中会访问到的非自动变量;
(3)多进程应用中被几个任务共享的变量;
1.当两个线程都要用到某一个变量且该变量的值会被改变时,应该用 volatile 声明,该关键字的作用是防止优化编译器把变量从内存装入CPU寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行。volatile的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值
volatile 常见的问题:
1)一个参数既可以是const,也可以是volatile;
可以是const是因为 程序不应该试图去修改他,可以是volatile是因为
他可能被意想不到的(如:一个变量可能会被一个中断服务程序所修改)改变
2)指针也可以是volatile
如:当一个中断服务子程序修改一个指向一个buffer的指针时
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如 果没有 volatile 关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。所以遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
二、static关键字
1)修饰函数体内的变量(局部)
static延长了局部变量的生命周期,static修饰的局部变量的,并不会随着函数执行的结束而销毁,当他所在的函数再次执行时,该静态局部变量会保留上次执行结束时的值
2)修饰函数体外的变量(全局)或修饰函数
static是对他修饰的对象进行了作用域限定,static修饰的函数以及函数外的变量,都只能在当前的源文件中被访问,其他的文件不能直接访问。当多个模块中有重名的对象出现时,我们可以用static进行修饰。
3)在面向对象编程中,static可以被用来修饰类内数据成员和成员函数。
1. 修饰数据成员
被static修饰的数据成员实际上相当于类域中的全局变量。因此,对于类的每个对象来说,它是共有的。它在整个程序中只有一份拷贝,只在定义时分配一次内存,供该类所有的对象使用,其值可以通过每个对象来更新。由于静态数据成员存储在全局数据区,因此,在定义时就要分配内存,这也就导致静态数据成员不能在类声明中定义。
2)修饰成员函数
同静态数据成员一样,静态成员函数也是属于类,而不属于任何一个类的实体对象,因此,静态成员函数不含有this指针。同时,它也不能访问类中其它的非静态数据成员和函数。(非静态成员函数可以访问静态数据数据成员和静态成员函数)
静态成员函数的访问方式: 既可以通过访问操作符(.)或者(->)来访问,也可以通过 <类名> :: <函数名> 的方式访问。
三、const关键字
const只读修饰符,他要求其修饰的对象为常量,不可以对其修改和二次赋值操作(不能作为左值出现)

const int a;   
	int const a;    //都表示一个常整型数
	
	int *const a;    //const具有“左结合性”,即const修饰*,表示一个指向整数的常指针
			
	const int *a;
	int const *a;   //根据“左结合性”,const修饰的是(*a),即一个整数,表示指针指向一个常整数
	
	
	int const *a const;  //第一个const修饰(*),第二个const修饰(a),表示一个指向常整数的常指针