static
静态变量是这样的:
静态变量的内存是整个程序开始就分配了内存,整个程序结束后内存才消失!
动态变量的就是用的时候才动态分配,用完之后就消失了!
静态变量给了变量初始的值,然后如果在程序中该值有变化的,那当前的值就是变化后的值,这个是它的原理搜索.
有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次函数调用时,该变量已有值,就是上一次函数调用结束时的值.这是就应该指定该局部变量为"局部静态变量",用static加以说明
引自 <<C程序设计>> 谭浩强
静态变量-----------------------------------------------------------------------------------------
静态变量的类型关键字是static。
静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。
例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。
对于自动变量,它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。
由此看来,一个变量可由static进行再说明,并改变其原有的存储方式。
静态局部变量-------------------------------------------------------------------------------------
静态局部变量属于静态存储方式,它具有以下特点:
(1)静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
(3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符。
(4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。
因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
不同作用-------------------------------------重要------------------------------------------------
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
这两者的区别就在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。
赋值问题-----------------------------------------------------------------------------------------
请比较一下两个递归函数调用自己(即运行f1(f1())或f2(f2()))时的的运行结果。
1 int f1() 2 { 3 static int n=0;//这里声明静态局部变量n,如果不是第一次使用本函数,则此句不会执行(因为n 是已经存在着的,并且保留着上一次使用后的数据。)-重要- 4 f1(); 5 printf("%d ",++n); 6 }
=============================
1 int f2() 2 { 3 static int n;// 4 n=0;//对n重新赋值为0; 5 f2(); 6 printf("%d ",++n); 7 }