靜態變量的類型說明符是static。靜態變量當然是屬於靜態存儲方式,但是屬於靜態存儲方式的量不一定就是靜態變量,例如外部變量雖屬於靜態存儲方式,但不一定是靜態變量,必須由 static加以定義后才能成為靜態外部變量,或稱靜態全局變量。對於自動變量,它屬於動態存儲方式。但是也可以用static定義它為靜態自動變量,或稱靜態局部變量,從而成為靜態存儲方式。由此看來,一個變量可由static進行再說明,並改變其原有的存儲方式。
1. 靜態局部變量
在局部變量的說明前再加上static說明符就構成靜態局部變量。例如:
靜態局部變量屬於靜態存儲方式,它具有以下特點:
(1)靜態局部變量在函數內定義,但不象自動變量那樣,當調用時就存在,退出函數時就消失。靜態局部變量始終存在着,也就是說它的生存期為整個源程序。
(2)靜態局部變量的生存期雖然為整個源程序,但是其作用域仍與自動變量相同,即只能在定義該變量的函數內使用該變量。退出該函數后,盡管該變量還繼續存在,但不能使用它。
(3)允許對構造類靜態局部量賦初值。若未賦以初值,則由系統自動賦以0值。
(4)對基本類型的靜態局部變量若在說明時未賦以初值,則系統自動賦予0值。而對自動變量不賦初值,則其值是不定的。根據靜態局部變量的特點,可以看出它是一種生存期為整個源程序的量。雖然離開定義它的函數后不能使用,但如再次調用定義它的函數時,它又可繼續使用,而且保存了前次被調用后留下的值。因此,當多次調用一個函數且要求在調用之間保留某些變量的值時,可考慮采用靜態局部變量。雖然用全局變量也可以達到上述目的,但全局變量有時會造成意外的副作用,因此仍以采用局部靜態變量為宜。
2.靜態全局變量
全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式,靜態全局變量當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。而靜態全局變量則限制了其作用域,即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它。由於靜態全局變量的作用域局限於一個源文件內,只能為該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。從以上分析可以看出, 把局部變量改變為靜態變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變為靜態變量后是改變了它的作用域,限制了它的使用范圍。因此static 這個說明符在不同的地方所起的作用是不同的。應予以注意。
轉載:https://blog.csdn.net/lanchengxiaoxiao/article/details/7880276