一、变量的存储方式
C语言变量的存储有两种方式:静态存储方式和动态存储方式,相应的生产期也有两种:静态生存期和自动生存期。
①静态存储方式:在程序运行前为变量内存分配内存,在程序结束后回收变量的内存。(静态生存期)
②动态存储方式:在程序运行过程中,根据需要动态地分配或回收内存,与静态存储方式相比,动态存储方式,具有更好的存储效率。(自动生存期)
注意:
1.所有的全局变量都是静态存储方式。
2.局部变量要根据存储类型来区分具体的存储方式。
二、局部变量的三种储存类型
三种储存类型:自动变量、静态局部变量、寄存器变量
①自动变量
自动变量的定义方式:
auto <数据类型> <变量名>
如:
auto int a;
当然,auto也可以省略不写,因为但凡没有声明储存类型的局部变量,一律默认为自动变量。
自动变量的分配和回收
只有在局部变量的作用域,自动变量才能被引用。
在程序进入作用域,编译系统自动为其提供内存;在离开作用域后,回收其内存。
例1:比较两数大小的函数:
#include <stdio.h>
int max(int x,int y) //主函数调用该函数进行传参时,为x,y分配内存
{
int z; //执行至此,为z分配内存
if(x > y)
z = x;
else
z = y;
return z; //执行至此,回收x,y,z的内存
}
int main()
{
int a, b, c; //执行至此,为a,b,c分配内存
scanf("%d%d", &a, &b);
c = max(a,b);
printf("max=%d\n",c);//执行至此,回收a,b,c的内存
return 0;
}
例2,
#include <stdio.h>
int fac(int n)
{
int f = 10;
f = f * n;
return (f);
}
int main()
{
int fac(int n);
int s;
s = fac(2);
printf("第一次调用的s:%d\n",s);
s = fac(3);
printf("第二次调用的s:%d\n",s);
return 0;
}
运行结果:
程序分析:
1、由于f定义为自动变量,程序进入函数是为f分配内存,函数返回时回收内存。
2、第一调用fac函数fac返回时f的内存被回收,第二次调用fac函数,又重新给f分配内存,所以两次的f是相互独立的变量。
②静态局部变量(static 局部变量)
定义形式:static <数据类型> <变量名>,如:
static int b;
如果不初始化,默认变量值为0;
如果要将上述程序的变量f定义为静态变量:
#include <stdio.h>
int fac(int n)
{
static int f = 10;
f = f * n;
return (f);
}
int main()
{
int fac(int n);
int s;
s = fac(2);
printf("第一次调用的s:%d\n",s);
s = fac(3);
printf("第二次调用的s:%d\n",s);
return 0;
}
运行结果:
程序分析:
1、由于f是静态变量,因此在程序执行前就为f分配内存,在运行过程中不会再次初始化,直到程序结束才回收内存。
2、因此,两次被调用的f是同意变量,第一次调用的f的值会继续保留给第二次调用。
例3、输出1到5的阶乘值
#include <stdio.h>
int fac(int n)
{
static int f = 1;
f = f * n;
return f;
}
int main()
{
int i;
for(i = 1;i <= 5;i ++)
{
printf("%d!=%d\n", i, fac(i));
}
return 0;
}
运行结果:
③寄存器变量
寄存器变量是存储在CPU寄存器的自动变量,便于快速访问。
寄存器变量的定义方式:register 数据类型 变量名
注意:由于寄存器变量存储在CPU的寄存器中,不存储在内存单元中,无法进行取地址运算。