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)比较静态局部变量和自动变量(动态局部变量)
静态局部变量 | 自动变量(动态局部变量) | 寄存器变量 | |
---|---|---|---|
关键字 | static | auto | register |
存储单元位置 | 在静态存储区 | 在动态存储区 | 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);
}
运行结果*