***register :修饰寄存器变量 (只能修饰局部变量,不能修饰全局变量)
内部寄存器结构:
1:冯·诺依曼结构
2:哈佛结构
作用:请求编译器尽可能将变量保存在CPU内部寄存器里面,从而省去CPU从内存
中提取数据的时间,从而提高执行效率。
尽可能的解释:CPU内存寄存器资源有限,把频繁出现的变量放在寄存器中。
使用注意事项:
(1):register不能修饰全局变量,全局变量可以被多个进程访问,当当前进程声明为
Register类型时,只有当前进程可以访问。
(2):不能用取地址去获取register,变量保存在寄存器中,而取地址是获取内存地址。
(3)register所修饰的变量一定是CPU所接受的数据类型。
*****static
(1):static修饰局部变量叫静态局部变量。
作用:延长局部变量的生命周期,使程序结束再释放。
(2):static修饰全局变量: 全局变量只在本文件可见,其他文件不可见,不可访问。
(3):static修饰函数:函数只能在本文件被调用,不能再其他文件调用。
(4):static修饰函数:函数只能在本文件被调用,不能在其他文件调用。
使用说明:
(1):当static修饰局部变量时,可以改变局部变量的生命周期。
(2):只想让全局变量在本文件被调用,不想其他文件调用。
(3):static修饰函数的作用:只想让函数在本文件被调用,不想其他文件调用。
****const
const修饰的变量叫只读变量
只读变量:
变量的空间可变,但不能通过变量名来修饰变量的值
如下:
int num = 5;
const int *p = # const 离那个变量近,那个变量不能自加
p++; 即(*P),不能自加
(*p)++;
num++;
const int *p = &num 不能通过p修改所指向的空间
int *const p = &num 不能通过p修改对应的空间
使用注意事项:
1:用const修饰变量时,对变量做初始化,否则后面此变量不可改
2:修饰函数形参,在函数实现过程中,避免修改实参的值。
***extern
extern关键字:只能用于扩展 没有被static关键字修饰的全局变量。默认情况下全局变量只能在定义它的文件中使用(从定义该全局变量开始到所在文件的文件尾),但如 果在另一个文件中将这个变量声明为外部变量,那么这个变量的作用域将被扩展到另外一个文件中。也可以在定义全局变量之前声明该变量,从而在文件中可以在定 义该全局变量前使用该全局变量。
extern关键字:在定义函数时如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用。C语言规定,如果在定义函数时省略extern,则隐含为外部函数。
在文件中要调用其他文件中的外部函数,则需要在文件中用extern声明该外部函数,然后就可以使用。
外部函数-用 extern声明
★用extern声明的外部函数可供其他文件调用.一般没有任何声明 的函数都是外部函数.
e.g. extern int fun(int a,int b)
★在需要调用此函数的文件中.用extern声明所用的函数是外部函数.
***typedef
作用:
1:重命名:提高代码的移植性。
2:方便我们定义变量,把复杂的变量定义成简单的名字。
3:给数据类型重命名,起到对变量名注释的作用。
***volatile
volatile的本意是“易变的”因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用volatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)
使用注意事项:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同 意义。