static
全局变量前面加关键字static,即全局静态变量
全局静态全局变量的特点:
1、未经初始化的静态全局变量会被程序自动初始化为0(在函数体内生命的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0);
2、静态全局变量在声明它的整个文件都是可见的,而在文件外是不可见的;
3、静态变量都在全局数据区分配内存,包括静态局部变量。对于一个完成的程序,在内存中的分布情况;
代码区 // low address
全局数据区 //
堆区 //
栈区 // high address
4、一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。
5、定义全局变量就可以实现变量在文件中的共享,定义静态全局变量的好处:
① 静态全局变量不能被其他文件所用;
② 其他文件中可以定义相同名字的变量,不会发生冲突;
全局变量和全局静态变量的区别
1)全局变量是不显式用static修饰的全局变量,全局变量默认是有外部链接性的,作用域是整个工程,一个文件内定义的全局变量在另一个文件中,通过extern全局变量的声明,就可以使用全局变量。
2)全局静态变量时显式用static修饰的全局变量,作用域时声明此变量所在的文件,其他得文件使用extern声明也不能使用。
const
1、可以定义const常量,具有不可变性;
2、编译器通常不为普通const常量分配内存空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读取内存的操作,使得效率变高。
volatile
volatile是一个类型修饰符,被设计用来修饰不同线程访问和修改的变量。
作用:作为指令的关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
简单的说就是防止编译器对代码进行优化,比如如下程序:
XBYTE[2]=0x55;
XBYTE[2]=0x56;
XBYTE[2]=0x57;
XBYTE[2]=0x58;
对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的操作,但是编译器就不能像对待纯粹的程序那样对待纯粹的程序那样对上述四条语句进行优化,只认为XBYTE[2]=0x58;(即忽略前三条语句,只产生一条及机器代码)。如果键入volatile,则编译器会逐一进行编译并产生相应的机器代码(四条)
volatile变量的几个例子
1)并行设备的硬件寄存器(如状态寄存器)
2)一个中断服务子程序中会访问到非自动变量
3)多线程应用中被几个任务共享的变量