变量的存储类别
- 从变量的作用域可以将变量分为全局变量和局部变量。
- 从变量的生存期(变量的存在时间)角度来划分,可以分为“静态存储变量”和“动态存储变量”。
第二种方式带来了“静态存储方式”和“动态存储方式”两个概念
首先先介绍一下程序在内存空间的分配情况
程序代码区 | 静态存储区 | 动态存储区 |
---|
存储区可以理解为内存,程序在整个运行期间所需要的数据就放在静态存储区和动态存储区中。
很容易知道全局变量是存储在静态存储区的,在程序运行期间全局变量所占的存储空间是固定不变的,不是动态分配与释放的。
那么什么样的数据存储在动态存储空间里呢?
有以下三种情况:
(1) 局部变量。
(2) 函数形参(函数形参可以理解为局部变量)
(3) 调用函数时现场的一些数据和返回地址等。
这些数据均是存储在动态存储空间里的。对于第三点需要说明的一点是:子函数在调用时开始分配内存空间(包括子函数里的局部变量),调用结束后这些内存空间就会被释放掉。且是动态分配和释放的。所以,即使是同一个子函数多次调用时,分配的存储空间也可能是不一样的。
那么可以让局部变量的值在函数调用后依然存在呢?
答案是肯定的。这里就需要用到关键字–static。只需要将局部变量用static声明一下即可。先看下面的程序:
#include <stdio.h>
int fun_sta()
{
static int val = 0;
val++;
return val ;
}
int main()
{
int reval = 0,i;
for(i; i<4; i++)
{
reval = fun_sta();
printf("static声明后返回的变量值为:%d\n",reval);
}
return 0;
}
运行的结果如下:
可见局部变量 val 的值并不是在每一次调用子函数 fun_sta() 时 都会被初始化。实际上用static声明的局部变量只有在第一次调用时会被初始化。即static int val = 0; 只执行了一次。如果没有初始化,默认初始化为0。