对于我等菜鸟来说,看到void,int,double,char还算有亲切感,但是经常一遇到那些不常用的C语言关键字就有点晕头转向。
本篇文章就对那些非常用关键字(主要是变量声明)进行一个总结。
1、auto :声明自动变量
auto声明的变量的后果其实就是不加auto时一样,不加的时候默认为隐式声明而已。
int a;
auto int a;//与第一个声明无差别
auto变量具有自动存储时期,代码块作用域,空链接。
2、register:声明寄存器变量
register声明的变量可以(但不是一定,视系统运行情况)被存储在CPU寄存器中以更快地访问和操作,因此不能对其使用地址运算符。
register int a;
scanf("%d", &a);//出错
register变量具有自动存储时期,代码块作用域,空链接。
3、static:声明静态变量
static声明的变量位置固定不动,即使函数执行完成,但是存储空间仍保留。
int main() {
int i;
for(i = 0; i < 3; i++) {
change();
}
return 0;
}
void change() {
int fade = 1;
static int stay = 1;
printf("%d %d\n", fade++, stay++);//打印结果为1 1 1 2 1 3
}
static变量具有静态存储时期,代码块作用域,空链接。
4、extern:声明引用变量
extern声明的变量表示此变量再其他源文件中定义,其消失时间也由定义它的函数决定。
extern int a;
int function() {
a++;
}
extern变量具有静态存储时期,代码块作用域,外部链接。
5、const:声明只读变量
const声明的变量不可在声明后被改变,即只读。
const int a = 5;
a = 6;//出错
6、volatile:声明易变变量
volatile声明的变量除了能被程序改变外还可以被其他代理(例如硬件)改变。
volatile int a;
volatile const int b;//允许,const只表面不能由程序改变
7、restrict:声明某指针式访问某数据的唯一方式。
restrict声明的变量只可用于指针,表面该指针式访问数据对象的唯一且初始的方式。方便编译器进行代码优化
int test[10], n;
int *restrict a = (int *)malloc(sizeof(int)*10);
int *b = test;
for(n = 0; n < 10; n++) {
a[n] += 5;
b[n] += 5;
test[n] *= 2;
a[n] += 3;
b[n] += 3;
}
此处编译器由于知道a是唯一的访问方式,所以可以直接优化为a += 8,而b则不行。
参考资料《C PRIMER PLUS》
(完)