变量的生存期(C语言)

标题

 上图表格中 auto与extern较少见,下面用程序写一下register和static类型。

C语言中static的作用如下

第一、在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。 
第二、static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。 
第三、static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候自动初始化为0; 
(1)不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用static修饰 
(2)考虑到数据安全性(当程想要使用全局变量的时候应该先考虑使用static)

C语言中register的作用如下

1.register修饰暗示编译程序相应的变量将被频繁使用的变量尽可能的将这个变量保存在CPU内部寄存器中而不是通过内存寻址来访问,是为了提升它的运行速率。

2、但是使用register修饰符有几点限制

(1)register变量必须是能被CPU所接受的类型。

这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。

(2)因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。

(3)只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。

在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束后释放寄存器。此后,在调用另外一个函数时又可以利用这些寄存器来存放该函数的寄存器变量。

(4)局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c;

(5)由于寄存器的数量有限(不同的cpu寄存器数目不一),不能定义任意多个寄存器变量,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。

下面用程序写一下register和static类型。下面程序是想知道循环执行了几次。

#include<stdio.h>

void counter(int);

void counter(int i){
	static int subtotal = 0;  //静态变量. 如果不用static的话 每次输出循环次数都为1.可以自己尝试一下
	
	subtotal ++;
	
	printf("counter函数被调用了%d次\n", subtotal);
	return ;
} 







int main(){
	int value;       //自动变量 
	register int i;  //将循环变量设置为寄存器存储模式(加快运行效率) 
	printf("请输入循环执行的次数(按0退出):");
	while(scanf("%d", &value) ==1 && value > 0){
		for(i = value; i >= 0; i--){
			//1.我们要知道循环执行了几次。
			//2.我们还想知道counter函数被调用了几次。 
			counter(i); //每次循环调用counter函数。
		}
        printf("请输入循环执行的次数(按0退出):");
	}
	
	
	return 0;
	
} 

猜你喜欢

转载自blog.csdn.net/oXunWuQiShi1/article/details/82287322
今日推荐