c语言==关键字(13)

来源:互联网 发布:学风水看什么书 知乎 编辑:程序博客网 时间:2024/06/10 04:47

关键字包括register,static,const,typedef,extern

register

含义:是寄存器变量
作用:请求编译器尽可能的将这个变量值保存在CPU内部的寄存器内,以节省CPU从内存中抓取数据的时间,提高代码的运行效率
适用变量:频繁被访问的变量,如循环变量
注意事项:1、只能修饰局部变量,而不能修饰全局变量或函数 2、不能通过取地址来得到变量的地址 3、修饰的变量一定要是CPU所能接受的数据类型

注释:
1、为何要尽可能的保存在寄存器内:因为CPU内部的寄存器有限,是稀缺资源

2、为何不能修饰全局变量:因为全局变量是会被多线程或多任务访问的,而被register访问的变量只有本进程知道变量保存在哪儿

3、为何不能取地址:因为变量此时保存在寄存器里,得到的地址是寄存器的地址。

static

含义:静态变量
修饰对象:可以修饰全局变量,也可以修饰局部变量,还可以修饰函数
作用
修饰局部变量的作用:延长他的生命周期,使得原本函数结束就要被释放的变量能够在程序结束之后再释放。
修饰全局变量的作用:使得该变量只能在本文件中被使用,并将全局变量保存在静态数据区,默认初始化为0
修饰函数的作用:使得该函数只能在本文件中被访问

何时修饰
何时修饰局部变量:想延长他的生命周期,让她程序结束后再释放,而将它修饰为静态局部变量又安全于全局变量
何时修饰全局变量:想让他只在本文件中被访问,并且可以重命名

注释:
1、如果另一函数a.c要调用本函数b.c的全局变量,则可以在a.c里加上

extern + 数据类型 + 变量名

因为extern的作用是外部声明。

2、被static修饰的函数,如果定义在一个未被修饰的函数后面。则先要在这个未被修饰的函数前面加上被修饰函数的声明。

3、为何想让变量在程序结束后释放,而不用全局变量呢:因为全局变量比较危险,对所有人都可见,而静态局部变量更安全

const

含义:是一个只读变量
注释:const修饰的是一个变量名,所以变量名对应的空间可变而不能通过变量名来修改这个空间

作用:使其修饰的变量名不能修改此空间,而其空间通过其他方式可以改变
注释:const离谁近,谁不能自加。

int num = 5;const int *p = #p++;(*p)++;num++;

此时const修饰的是*p,所以 (*p)++不可以实现。
因此,const int *p 和int const *p不可以实现(*p)++
而int * const p不可以实现p++

修饰对象:变量及形参
注释:防止实现函数过程中,会修改实参的值

注意事项:一定要将变量初始化,不然以后无法赋值

typedef

含义:给数据类型重命名
作用:1、提高代码移植性 2、将复杂名变为简单名,方便编写程序 3、同时也能起注释作用

volatile

含义:修饰被不同线程访问和修改的变量。
注释:如果不加入volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。

作用:确保本条指令不会因编译器的优化而省略,且要求每次直接读值.
简单地说就是防止编译器对代码进行优化.比如如下程序:

XBYTE[2]=0x55;XBYTE[2]=0x56;XBYTE[2]=0x57;XBYTE[2]=0x58;

对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,则编译器会逐一的进行编译并产生相应的机器代码(产生四条代码).

0 0