关于static与register关键字

本文章的大部分内容出自《C语言深度剖析》一书,再此只是记录对他书中例子的分析并加上一些个人的理解。

对于static关键字,书中对其做了重点讲解,其实在我们学习C++或者Java的时候,也会对其有比较长篇幅的论述。在C语言中,它就是用来修饰变量和函数。而变量又会分为全局变量和局部变量。

如下面的示例程序所示,其中j就是静态全局变量,i就是静态全局变量。它们都会存在内存的静态区。对于静态全局变量来说,作用域仅限于变量被定义的文件中,其他文件即使使用extern声明也没法使用它。准确的说是从定义之处开始,到这个文件结束,也就是说在它定义之前的那些代码也是无法使用它的。如果想要使用,就得在定义它的时候加上extern。

对于静态局部变量,在函数体中定义,就只能在这个函数里面使用了,同一个文档中的其他函数是永不了的。由于被static修饰的变量总是存在内存中的静态区,所以即使这个函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。所以在下面的测试用例中,i的值在不断的增加。

#include<stdio.h>

static int j;

int  func1(void){
	static int i = 0;
	i++;
	return i;
}

int  func2(void){
	j = 0;
	j++;
	return j;
}

int main(void){
	int k,m,n;
	for(k = 0 ;k < 10; k++){
		m = func1();
		printf("round%d:i = %d;",k,m);
		n = func2();
		printf("round%d:j = %d\n",k,n);
	}
	return ;
}

而static在修饰函数的时候,这个函数就成了静态函数,这个函数只能在这个文件中使用,所以也叫内部函数。使用内部函数的好处就是不同的人编写不同的函数时,不用但是自己定义的函数,是否会与其他文件中的函数同名。

 

Register这个关键字我们比较少碰到,从字面就知道它就是定义一个寄存器变量,寄存器的特点就是快了。所以我们在定义一个经常用到的变量时,我们可以考虑将其定义成register变量。但是定义的寄存器变量并不一定会存在CPU的寄存器中,因为寄存器就那么几个,如果这类变量多了,肯定是存不下的。

既然这个register变量这么快,好的东西用起来肯定限制就会多一些。在定义register变量时,它必须是cpu所接受的类型。这就意味着register变量必须是一个单个的值,并且其长度应小于或等于整形的长度。而且register变量可能不存在在内存中,所以不能用取址运算符“&”来获取register变量的地址。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值