马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 6bingame 于 2024-12-10 20:31 编辑
变量的存储类别
自动类型(auto)
用自动类型关键字 auto 说明的变量称为自动变量。其一般形式为:
auto 类型 变量名;
自动变量属于动态局部变量,该变量存储在动态存储区。定义时可以加auto说明符,也可以省略。
寄存器类型(register)
寄存器类型变量的存储单元被分配在寄存器当中,关键字register说明。其一般形式为:
register 类型 变量名;
寄存器变量时动态局部变量,存放在CPU的寄存器或动态存储区中,这样可以提高存取的速度,因为寄存器的存取速度比内存快得多。该类变量的作用域、生存期与自动变量相同。如果没有存放在通用寄存器中,便按自动变量处理。
但是由于计算机中寄存器的个数有限的,寄存器的位数也是有限的,所以使用register说明变量时要注意以下几点。
(1)寄存器类型的变量不宜过多,一般可将频繁使用的变量放在寄存器中(如循环中涉及的内部变量),以提高程序的执行速度。
(2)变量的长度应该与通用寄存器的长度相当,一般为int型或char型。
(3)寄存器变量的定义通常是不必要的,现在优化的编译系统能够识别频繁使用的变量,并能够在不需要编程人员作出寄存器存储类型定义的情况下,就把这些变量放在寄存器当中。
寄存器变量示例#include<stdio.h>
int main()
{
int=5,y=10,k; //自动变量x,y,k
for(k=1;k<=2;k++)
{
register int m=0,n=0; //寄存器变量m,n
m=m+1;
n=n+x+y;
printf("m=%d\tn=%d\n",m,n);
}
return 0;
}
例题分析:本范例中定义了两类变量,一类是自动变量x、y和k,还有两个寄存器变量m和n。
静态类型(static)
静态类型的变量占用静态存储区,用static关键字来说明。其一般形式为:
static 类型 变量名;
静态类型又分为静态局部变量和静态全局变量。C语言规定静态局部变量有默认值,int 型等于0,float 型等于0.0,char 型为 '\0', 静态全局变量也如此。而自动变量和寄存器变量没有默认值,值为随机数。
静态局部变量
定义在函数内的静态变量称为静态局部变量。关于静态局部变量的几点说明如下。
(1)静态局部变量是存储在静态存储区的,所以在整个程序开始时就被分配固定的存储单元,整个程序运行期间不再被重新分配,故其生存期是整个程序的运行期间。
(2)静态局部变量本身也是局部变量,具有局部变量的性质,即其作用域是局限在定义它的本函数体内的。
如果离开了定义它的函数,该变量就不再起作用,但其值仍然存在,因为存储空间并未释放。
(3)静态局部变量赋初值的时间是在编译阶段,并且只被赋初值一次,即使它所有的函数调用结束,也不释放存储单元。
因此不管调用多少次该静态局部变量的函数,它仍保留上一次调用函数时的值。
静态局部变量示例:打印1~5的阶乘#include<stdio.h>
long fac(int n)
{
static long f=1; //定义静态局部变量f,仅初始化一次,在静态存储区分配空间
f=f*n;
return f;
}
int main()
{
int k;
for(k=1;k<=5;k++)
{
printf("%d!=%ld\n",k,fac(k));
}
printf("\n");
return 0;
}
例题分析:程序从main()函数开始运行,此时fac()函数内的静态局部变量f已在静态存储区初始化为1。
当第一次调用fac()函数时,f=1*1=1,第一次调用结束并不会释放f,仍保留1。
第二次调用fac()函数时,f=1*2=2(其中1仍是上次保留的结果),第二次调用结束f的值仍保留为2。
第三次调用,f=2*3=6,f内这次保留的是6。
第四次调用......第五次调用的结果为120(24*5)。 |