1 普通的全局变量
1.1 概念
在函数外部定义的变量
int num = 100; // num就是一个全局变量
int main()
{
return 0;
}
1.2 作用范围
全局变量的作用范围,是程序的所有地方
只不过用之前需要声明。
声明方法extern int num;
注意声明的时候,一般不进行赋值
1.3 生命周期
程序运行的整个过程,一直存在,直到程序结束
注意:定义普通的全局变量的时候,如果不赋初值,它的值默认为0
#include <stdio.h>
// 定义一个普通全局变量
// 只要在main函数外(也在子函数外)的变量,就是全局变量
// 如果全局变量没有进行初始化,则系统自动将其初始化为0
int num;
// 全局变量可以在程序的任意一个位置进行对其的操作
void function()
{
num = 888;
}
int main(int argc, char *argv[])
{
printf("num = %d\n",num);
function();
printf("num = %d\n",num);
return 0;
}
执行结果:
2 静态全局变量
2.1 概念
定义全局变量的时候,前面使用static来修饰
static int num = 100; // num就是一个静态全局变量
int main()
{
return 0;
}
2.2 作用范围
static限定了静态全局变量的作用范围
只在它定义的.c(源文件)中有效
2.3 生命周期
在程序的整个运行过程中,一直存在。
注意:定义静态全局变量的时候,如果不赋初值,它的默认值是0
#include <stdio.h>
// 定义一个静态全局变量
// 静态全局变量只能在其定义的.c文件中任意位置使用,不能跨文件使用
static int num;
void function()
{
num++;
}
int main(int argc, char *argv[])
{
printf("num = %d\n",num);
function();
printf("num = %d\n",num);
return 0;
}
执行结果:
3 普通的局部变量
3.1 概念
在函数内部定义的,或者复合语句中定义的变量
int main()
{
int num; // 局部变量
{
int a; // 局部变量
}
}
3.2 作用范围
在函数定义的变量,在函数中有效
在复合语句中定义的,在复合语句中有效
3.3 生命周期
在函数调用之前,局部变量不占用空间,调用函数的时候,才为局部变量开辟空间,函数结束了,局部变量就释放了。在复合函数中的定义亦如此。
#include <stdio.h>
// 定义一个局部变量
// 在函数内部定义的,不加任何修饰的变量都是局部变量
void function()
{
int num = 100;
num++;
printf("num = %d\n",num);
return ;
}
int main(int argc, char *argv[])
{
// 局部变量只能在定义的函数的内部使用,生命周期相对较短,函数结束,局部变量就会释放掉。
// 故printf("num = %d\n",num);运行会出错,
// 原因就是局部变量的的作用范围只在函数内部或者复合语句内部有用,在主函数中没有定义
//printf("num = %d\n",num);
// 三次调用函数输出的结果是一样的
// 还是作用范围,当function函数执行完毕后,
// 局部变量就释放掉了,所以再次调用函数function还是会对num进行初始化(开辟空间)
function();
function();
function();
return 0;
}
执行结果:
4 静态的局部变量
4.1 概念
定义局部变量的时候,前面加static修饰
4.2 作用范围
在它定义的函数或复合语句中有效。
4.3 生命周期
第一次调用函数的时候,开辟空间赋值,函数结束后,不释放,以后在调用函数的时候,就不再为其开辟空间,也不赋初值,用的就是以前的那个变量。
#include <stdio.h>
// 定义一个静态局部变量
// 在函数内部定义的,不加任何修饰的变量就是静态局部变量
void function()
{
// 如果普通局部变量不进行初始化,则默认值是随机值
// 如果静态局部变量不进行初始化,则默认值是0;
int a; // 普通局部变量
static int num; // 静态局部变量
printf("a = %d\n",a);
printf("num = %d\n",num);
return ;
}
void function1()
{
// 静态局部变量不会随着当前函数执行结束而释放空间,下次使用的函数之前的空间
// 静态局部变量只会初始化一次
static int num1 = 100;
num1++;
printf("num1 = %d\n",num1);
}
int main(int argc, char *argv[])
{
// 调用function函数
function();
// 调用function1函数
// 由于静态局部变量只会初始化一次,所以它的值会累加。重复调用不会重新开辟空间。
function1();
function1();
function1();
return 0;
}
执行结果:
5 总结
-
定义普通局部变量,如果不赋初值,它的值是随机的。
定义静态局部变量,如果不赋初值,它的值是0
-
普通全局变量,和静态全局变量如果不赋初值,它的值为0
-
被static修饰的局部变量:
生命周期:从定义开始,到整个程序截至(被延长)
作用域:模块括号内有效
-
被static修饰的全局变量:
生命周期:从定义开始,到整个源程序截至
作用域:服务于本文件(被缩短)