视频参考:
https://chuanke.baidu.com/v1326210-129900-334450.html
所有变量都占着内存,变量什么时候占着内存,什么时候从内存消失,这叫做变量的生存周期。
按照变量的生存周期分类有:
1、自动变量auto
2、静态变量static
3、寄存器变量register
4、外部变量extern
auto和static变量是重点
变量作用域
有时候变量还未消亡,你却不能使用它,这就是变量作用域在作怪。
按照变量作用域分局部变量和全局变量。没有什么关键字修饰,只看你在什么地方定义变量。
下面将从变量生存周期和作用域来分析几种不同类变量的特性。
局部变量
定义局部变量的关键字为auto,也叫自动变量。(大发现:平时我们定义的变量都是局部变量)
全局变量
在函数外面定义的变量都是全局变量,不管他用什么关键字修饰。
特点:
1、全局变量的生存期和作用域在从他的定义点开始,一直到本文件的程序结束前,都是有效的,程序结束后消亡,释放内存。
注意:在同一作用域中,如果局部变量与全局变量重名,全局变量将暂时退出幕后,这是只能操作局部变量。
程序1:局部变量和全部变量
1 /*局部作用域和变量周期演示*/
2 #include <stdio.h>
3 int a=1,b=2; //全局变量,在函数外面
4 void fun(int c,int d) //局部变量
5 {
6 int a=3,b=4; //局部变量与全局变量重名,暂时隐瞒全局变量
7 auto int e=5; //自动全局变量,相当于int e=5;
8 int f=6; //局部变量
9 printf("在fun函数中使用局部变量:c=%d
",c);
10 printf("在fun函数中使用局部变量:e=%d
",e);
11 printf("在fun函数中只能使用局部变量:a=%d
",a);
12 }
13
14 int g=10,h=11; //全局变量
15 main()
16 {
17 int i=12,j=13; //局部变量
18 fun(i,h);
19 printf("在main函数中使用全局变量:a=%d
",a);
20 printf("在main函数中使用全局变量:g=%d
",g);
21 }
22
静态变量
静态变量在程序执行点离开它的作用域时,它并不消失,它还会死霸那片内存不放,等着你别的函数下次来使用它。
1 /*静态变量演示*/
2 #include <stdio.h>
3 void fun()
4 {
5 static int i=0; //静态局部变量
6 int a=0; //局部变量
7 i++;
8 a++;
9 printf("i=%d,a=%d
",i,a);
10 }
11
12 main()
13 {
14 /*三次调用函数,在函数中静看静态变量的变化*/
15 fun();
16 fun();
17 fun();
18 }
思考:为什么i分别可以加1,a都是等于1???
寄存器变量:
寄存器变量不放在内存中,直接放在CPU寄存器中。因为CPU中的寄存器数量有限,所以寄存器变量不能设置太多。
特点就是比普通内存速度快上百倍。
外部变量:如果一个文件要使用其他文件中的全局变量,就要使用extern声明,这样它就可以和其他文件共享此变量。