转自:http://www.cnblogs.com/yangfengming/archive/2009/06/23/1509559.html
静态变量
静态变量的类型说明符是static,静态变量属于静态存储方式,但属于静态存储方式的不一定是静态变量,如外部变量(全局变量)就属于静态存储方式,但不是静态变量。必须有static加以定义才是静态变量,或静态全局变量。对于自动变量(局部变量),属于动态存储方式。当自动变量用static定义后就成为了静态自动变量。或静态局部变量,从而成为静态存储方式。
局部变量
以前的累计值不会通过调用函数保留下来,函数只会简单地返回调用它的那个相同值。
静态局部变量
1.静态局部变量在函数类定义,但它不像局部变量那样,当调用时就存在,推出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
2.静态局部变量的生存期虽然为整个源程序,当期作用域仍与自动变量相同。只能在定义改变量的函数内使用该变量,退出该函数后,尽管改变了还继续存在,但不能使用它。
3.允许对构造类静态局部变量赋初值。若未赋予初值,则有系统自动赋予0值。
4.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源程序的
量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的
值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜.
全局静态变量与全局变量的区别
1.全局变量的说明之前再冠以static就构成了静态的全局变量,全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式了。这两者在存储方式上并无同。
2.非静态全局变量的作用域是整个原程序,当一个源程序由多个源文件组成时,全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,及只在定义该变量的源文件内有效,在
同一源程序的其他源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该院文件内的函数公用,因此可以避免其他源文件中引起错误。
总结
从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。
转自:http://justshare.iteye.com/blog/407168
要讲清静态变量与全局变量的区别,要从四个方面:一为修饰符,二为存储地址,三为生命周期,四为外部可访问性。
修饰符:全局变量在源文件的函数外部声明(不含extern),但若其它源文件要调用这个变量,就需要通过extern关键字来引用一下。静态变量用static来修饰;
存储地址:两者都是存储在静态存储区,非堆栈上,它们与局部变量的存储分开;
生命周期:两者都是在程序编译时或程序装入时由系统自动分配的,程序结束时消亡;
外部可访问性:全局变量在整个程序的任何地方均可访问,而静态变量相当于面向对象中的私有变量,它的可访问性只限定于声明它的那个源文件,即作用域仅局限于本文件(静态函数也一样);
由于它们都是由系统分配的存储空间,所以它们的存储地址是固定的,但值是可变的