C语言----变量生存期(高阶篇三十八)
变量的生老病死
所有变量都占着内存,变量什么时候开始占着内存,什么时候从内存中消失,这叫做变量的生存周期。
按照变量的生存周期分类有:
※自动变量auto
※静态变量static
※寄存器变量register
※外部变量extern
※函数也有外部函数extern和静态函数static两种
变量作用域
有时候变量还未消亡,你却不能使用它,这就是变量作用域在作怪。
按照变量作用域分局部变量和全局变量。它们没有什么关键字修饰,只是看你在什么部位定义变量。
从变量生存期和作用域来分析几种不同种类变量的特性。
局部变量
定义局部变量的关键字为auto,也叫自动变量。
C语言规定自动变量在定义时前面的auto可以省略。
如:int a; 等价于 auto int a;
全局变量
在函数外面定义的变量都是全局变量,不管它用什么关键字修饰。
全局变量的特点:
※全局变量的生存期和作用域在从它的定义点开始,一直到本文件的程序结束前,都是有效的,程序结束后消亡,释放内存。
※全局变量作用域中的所有函数将共享这个全局变量中的内存数据,各函数之间也可以通过全局变量传送数据,但在职业程序员中,这是种很不好的习惯。
注意:在同一作用域中,如果局部变量与全局变量重名,全局变量将暂时退居幕后,这时只能操作局部变量。
程序1
局部变量和全局变量
// 38-1变量生存期.c #include <stdio.h> int a = 1, b = 2; //全局变量 void fun(int c,int d) { int a = 3, b = 4; //局部变量与全局变量重名,隐藏全局变量 auto int e = 5; //自动局部变量 int e = 5; 相等 int f = 6; //局部变量 printf("在fun函数中使用局部变量:c = %d\n", c); printf("在fun函数中使用局部变量:e = %d\n", e); printf("在fun函数中使用全局变量:a = %d\n", a); } int g = 10, h = 11; //全局变量 main() { int i = 12, j = 13; //局部变量 fun(i, h); printf("在main函数中使用全局变量:a = %d\n", a); printf("在main函数中使用全局变量:g = %d\n", g); }
静态变量
静态变量在程序执行点离开它的作用域时,它并不消亡,它还会死霸着那片内存不放,等着你别的函数下次来使用它。与全局变量不同的是:静态变量通常在函数内部定义,而全局变量只能在函数外部定义。它们的共同点是:在程序结束时,它们都会消亡。
程序2
静态变量
// 38-2静态变量static.c // #include <stdio.h> void fun() { static int i = 0; //静态局部变量 一直占用内存区 int a = 0; //局部变量 i++; a++; printf("静态变量值:i = %d\n,自动变量值:a = %d\n", i, a); } main() { fun(); fun(); fun(); }
寄存器变量
寄存器变量不放在内存中,直接放在CPU寄存器中。因为CPU中的寄存器数量有限,所以寄存器变量不能设置太多。
寄存器变量的特点是:比普通内存速度快上百倍。
外部变量
如果一个文件要使用其它文件中的全局变量,就要使用extern声明,这样它就可以和其它文件共享此变量。