理解C语言的局部变量、全局变量和静态局部变量
1.作用域
(1)局部变量:局部作用域。它只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
(2)全局变量:全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。
(3)静态局部变量:局部作用域。它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
2.内存分配
(1)全局变量、静态局部变量都在静态存储区分配空间。
(2)局部变量在栈里分配空间。
3.生命周期
(1)局部变量:在进入局部变量所在的代码块时诞生,该代码块退出时,才死亡。
(2)全局变量:在程序开始运行之前的初始化阶段就诞生,直到程序结束,才死亡。
(3)静态局部变量:在第一次函数被调用时诞生并初始化,但在函数退出时它不死亡,而是保持其值等待函数下一次被调用,直到程序结束。
实例1:局部变量和全局变量
代码如下:
#include <stdio.h>
int a,b; //全局变量
void fun();
int main()
{
int i,j;
i=6,j=3; //i,j局部变量
printf("(1) a=%d,b=%d\n",a,b);
printf("(2) i=%d,j=%d\n",i,j);
for(int i=0;i<3;i++)//i局部变量
{
printf("(3) i=%d,j=%d\n",i,j);
}
printf("(4) i=%d,j=%d\n",i,j);
a=5;b=-3;
printf("(5) a=%d,b=%d\n",a,b);//全局变量a,b
fun();
}
int p,q; //全局变量
void fun()
{
printf("(6) p=%d,q=%d\n",p,q);
printf("(7) a=%d,b=%d\n",a,b);
int a=4,b=2; //a,b局部变量
printf("(8) a=%d,b=%d\n",a,b); //局部变量a,b
}
运行结果:
实例2 局部变量、全局变量和静态局部变量
#include <stdio.h>
int a,b,c; //全局变量
void fun();
int main()
{
int i;
printf("(1) a=%d,b=%d\n",a,b);
c=2;
for(i=0;i<5;i++)
{
fun();
}
a=5;b=-3; //局部变量
printf("(2) a=%d,b=%d\n",a,b);
printf("(3) c=%d\n",c);
}
void fun()
{
static int c=8,d;//静态局部变量
printf("(f.1) c=%d,d=%d\n",c,d);
c++;d++;
}
运行结果: