您的位置:首页 > 其它

变量的存储方式和生存期(局部变量and全局变量)

2018-02-04 17:41 721 查看

变量的存储方式和生存期

在C语言中,每一个变量和函数都有两个属性:数据类型数据的存储类别。对数据类型,读者已经熟知(如整形、浮点型等)。存储类别指的是数据在内存中存储方式(如静态存储动态存储)。

局部变量的存储类别

1.自动变量(auto变量)

函数中的局部变量,如果不专门声明为static(静态)存储类型,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的局部变量(包括在符合语句中定义的局部变量),都属于此类。在调用该函数时,系统会给这些变量分配存储空间,在函数调用结束时,就自动释放这些存储空间。因此这些局部变量被称为自动变量。自动变量用关键字auto作存储类别的声明。例如:

int f(int a)
{
auto int b,c=3;
……
}


其中,a是形参,b和c 是自动变量,对c赋值3.执行完f函数后,自动释放a,b,c所占的存储单元。

实际上,关键字“auto”可以省略,不写auto则隐含指定为“自动存储类别”,它属于动态存储方式。程序中大多数变量属于自动变量。例如:

int b,c=3;
与
auto int b,c=3;
等价


2.静态局部变量(static局部变量)

有时希望函数中的局部变量的值在函数调用结束后不消失而继续保留原来的值,即其占用的存储单元不释放,在下次再调用该函数时,该变量已有值(就是上一次调用结束后的值)。这时就应该指定该局部变量为“静态局部变量”,用关键字static进行声明。例如:

int main()
{
int fac(int n);
int i;
for(i=1;i<=5;i++)                        //先后5次调用fac函数
printf("%d!=%d\n",i,fac(i));          //每次计算并输出i!的值
return 0;
}
int fac(int n)
{
static int f=1;                           //f保留了上次调用结束时的值
f=f*n;                                    //在上次的f值的基础上再乘以n
return (f);                               //返回值f是n!的值
}


3.寄存器变量(register变量)

一般情况下,变量(包括静态存储方式和动态存储方式)的值是存放在内存中的,当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到运算器中。经过运算器运算,如果需要存数,再从运算器将数据送到内存存放。

如果有一些变量使用频繁(例如,在一个函数中执行10000次循环,每次循环中都要引用某局部变量),则为存取变量的值花费不少时间。为提高执行效率,允许将均不变了的值放在CPU中的寄存器中,需要时直接从寄存器取出参加运算,不必再到内存中去取。由于对寄存器的存取速度远高于对内存的存取速度,因此这样做可以提高执行效率。这种变量叫做寄存器变量。用关键字register作声明。如

register int f;    //定义f为寄存器变量


由于现在的计算机速度越来越快,性能越来越高,优化的编译系统能够识别使用频繁的变量,从而自动的将这些变量放在寄存器中,而不需要程序设计者指定。因此,现在实际上用register声明变量的必要性不大。

由上可知,3中局部变量的存储位置是不同的:自动变量存储在动态存储区;静态局部变量存储在静态存储区;寄存器存储在CPU的寄存器中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐