局部变量、全局变量、静态局部变量、静态全局变量的区别
局部变量
局部变量也叫auto自动变量(auto可写可不写),一般情况下代码块{}内部定义的变量都是自动变量,它有如下特点:
- 在一个函数内定义,只在函数范围内有效
- 在复合语句中定义,只在复合语句中有效
- 随着函数调用的结束或复合语句的结束局部变量的声明声明周期也结束
- 如果没有赋初值,内容为随机
#include <stdio.h>
void test()
{
//auto写不写是一样的
//auto只能出现在{}内部
auto int b = 10;//该局部变量只在该函数内有效
}
int main(void)
{
//b = 100; //err, 在main作用域中没有b
if (1)
{
//在复合语句中定义,只在复合语句中有效
int a = 10;
printf("a = %d\n", a);
}
for(int flag = 1; flag<10;flag++)
{
//flag只能在这个循环里使用,因为只定义在了这个复合语句中,只在复合语句中有效
}
//a = 10; //err离开if()的复合语句,a已经不存在
return 0;
}
静态(static)局部变量
static局部变量的作用域也是在定义的函数内有效
static局部变量的生命周期和程序运行周期一样,同时staitc局部变量的值只初始化一次,但可以赋值多次
static局部变量若未赋以初值,则由系统自动赋值:数值型变量自动赋初值0,字符型变量赋空字符
#include <stdio.h>
void fun1()
{
int i = 0;
i++;
printf("i = %d\n", i);
}
void fun2()
{
//静态局部变量,没有赋值,系统赋值为0,而且只会初始化一次
static int a; //在数据区进行存储
// fun2()一旦加载,static int a; 这条语句就会执行,而且是先于fun2()函数,
//后期执行该函数,也不会执行这条语句,而是跳过
a++;
printf("a = %d\n", a);
}
int main(void)
{
fun1();
fun1();
fun2();
fun2();
return 0;
}
全局变量
在函数外定义,可被本文件及其它文件中的函数所共用,若其它文件中的函数调用此变量,须用extern声明
全局变量的生命周期和程序运行周期一样
不同文件的全局变量不可重名
extern全局变量声明
extern int a;声明一个变量,这个全局变量在别的文件中已经定义了,这里只是声明,而不是定义。
静态(static)全局变量
在函数外定义,作用范围被限制在所定义的文件中
不同文件静态全局变量可以重名,但作用域不冲突
static全局变量的生命周期和程序运行周期一样,同时staitc全局变量的值只初始化一次
表格对比图
变量类型 | 作用域 | 生命周期 | 存储位置 | 未初始化 |
---|---|---|---|---|
局部变量 | 函数内部 | 从局部变量创建到函数结束 | 栈区 | 报错或乱码 |
静态局部变量 | 函数内部 | 从程序创建到程序销毁 | 数据区 | 默认为0 |
全局变量 | 项目中所有文件 | 从程序创建到程序销毁 | 数据区 | 默认为0 |
静态全局变量 | 定义所在的文件中 | 从程序创建到程序销毁 | 数据区 | 默认为0 |
参考:
[1]C基础讲义2018修订版(黑马程序员)