C语言中局部变量的存储类别和静态局部变量的使用

23 篇文章 0 订阅

C语言中局部变量的存储类别和静态局部变量的使用

C语言中,变量和函数都有两个属性:数据存储类别和数据类型。其中,局部变量的存储方式主要有三种不同的方式:动态存储方式,静态存储方式和寄存器存储方式。

例如:
(1)动态存储方式,即自动变量(auto变量)

auto int b,c=3;

其中关键字auto表示数据存储类别;int 表示数据类型。

(2)静态存储方式,静态局部变量(static 局部变量)

static int c=30;

其中,关键字static表示静态存储方式;int表示数据类型。
(3) 寄存器变量(register变量)
如果有些变量使用频繁(比如,在一个函数中执行了100000次循环,每次循环都要引用局部变量),则为存储变量的值要花费不少时间。为提高执行效率,允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。

register int s;

其中,register为寄存器关键字。
什么情况下需要用局部静态变量呢?需要保留函数上一次调用结束时的值时。举例
静态局部变量的具体应用例子1*****:

#include <stdio.h>
int main()
{
	int fun1(int);				//函数声明
	int a=10,i;
	for(i=0;i<5;i++)
	    printf("%d\n",fun1(a));
	return 0;
}

// 子函数fun1 
int fun1(int a)
{
	auto int b=20;
	static int c=30;
	b=b+10;
	c=c+10;
	return(a+b+c);
}

运行结果*
静态局部变量的具体应用例子运行结果
(3)比较静态局部变量和自动变量(动态局部变量)

静态局部变量自动变量(动态局部变量)寄存器变量
关键字staticautoregister
存储单元位置在静态存储区在动态存储区CPU寄存器中
存在周期在程序整个运行期间都不释放函数调用结束后就释放
赋初值次数在编译时赋初值,即只赋初值1次。在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。自动变量赋初值,不是在编译时进行的,而是在函数调用时进行的,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
不赋初值时编译时自动赋初值0(对数值性变量)或空字符’\0’(对字符型变量)。它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新分配存储单元,而所分配的单元中的内容是不可知的。
其他函数是否可以引用虽然静态局部变量在函数调用结束后仍然存在,但是其他函数是不能引用它的。因为它是局部变量,只能被本函数引用,而不能被其他函数应用。也不能被其他函数引用

静态局部变量的具体应用例子2*****:

//输出1到10的阶乘值 

#include <stdio.h>
int main()
{
	int fac(int n);
	int i;
	for(i=1;i<=10;i++)
	printf("%d!=%d\n",i,fac(i));
	return 0;
 } 
 
 // 子函数fac
 int fac(int n) 
 {
 	static int f=1;
 	f=f*n;
 	return(f);
 }


运行结果*

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值