1.局部变量
局部变量也叫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 ", a); } //a = 10; //err离开if()的复合语句,a已经不存在 return 0; }
2.静态局部变量
在局部变量前面加上static关键字
- static局部变量的作用域也是在定义的函数内有效
- static局部变量的生命周期和程序运行周期一样,同时staitc局部变量的值只初始化一次,但可以赋值多次
- static局部变量若未赋以初值,则由系统自动赋值:数值型变量自动赋初值0,字符型变量赋空字符
- static局部变量,在编译期间就已经分配空间,函数没有调用前就已经存在
- 只能用常量初始化
#include <stdio.h> void fun1() {
//调用完自动释放 int b = 0; b++; printf("b = %d ", b); } void fun2() { //静态局部变量,没有赋值,系统赋值为0,而且只会初始化一次 static int a; a++; printf("a = %d ", a); } int main() { fun1(); fun1(); fun2(); fun2(); return 0; }
静态局部变量在初始化后没有释放,所以第二次调用函数,在原来的基础上操作
如果在函数中有多个形参,形参的创建顺序从右向左
3.全局变量
-
在函数外定义,可被本文件及其它文件中的函数所共用,若其它文件中的函数调用此变量,须用extern声明
-
全局变量的生命周期和程序运行周期一样,在编译阶段已经分配空间(函数没有执行前)
-
不同文件的全局变量不可重名
- 只能定义一次,可以声明多次
4.全局静态变量
- 在函数外定义,作用范围被限制在所定义的文件中
-
不同文件静态全局变量可以重名,但作用域不冲突
-
static全局变量的生命周期和程序运行周期一样,同时staitc全局变量的值只初始化一次,默认值为0