C语言非常用关键字解析

对于我等菜鸟来说,看到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》


(完)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值