靜態(tài)變量 類型說明符是static磕潮。
靜態(tài)變量屬于靜態(tài)存儲方式抱怔,其存儲空間為內(nèi)存中的靜態(tài)數(shù)據(jù)區(qū)(在靜態(tài)存儲區(qū)內(nèi)分配存儲單元)跺嗽,該區(qū)域中的數(shù)據(jù)在整個程序的運行期間一直占用這些存儲空間(在程序整個運行期間都不釋放)得问,也可以認為是其內(nèi)存地址不變,直到整個程序運行結(jié)束(相反丈氓,而auto自動變量周循,即動態(tài)局部變量,屬于動態(tài)存儲類別万俗,占動態(tài)存儲空間湾笛,函數(shù)調(diào)用結(jié)束后即釋放。靜態(tài)變量雖在程序的整個執(zhí)行過程中始終存在闰歪,但是在它作用域之外不能使用嚎研。
另外,屬于靜態(tài)存儲方式的量不一定就是靜態(tài)變量库倘。 例如:外部變量雖屬于靜態(tài)存儲方式临扮,但不一定是靜態(tài)變量论矾,必須由 static加以定義后才能成為靜態(tài)外部變量,或稱靜態(tài)全局變量杆勇。
所有的全局變量都是靜態(tài)變量贪壳,而局部變量只有定義時加上類型修飾符static,才為局部靜態(tài)變量蚜退。
靜態(tài)變量可以在任何可以申請的地方申請闰靴,一旦申請成功后,它將不再接受其他的同樣申請关霸。
靜態(tài)變量并不是說其就不能改變值传黄,不能改變值的量叫常量。 其擁有的值是可變的 队寇,而且它會保持最新的值。說其靜態(tài)章姓,是因為它不會隨著函數(shù)的調(diào)用和退出而發(fā)生變化佳遣。即上次調(diào)用函數(shù)的時候,如果我們給靜態(tài)變量賦予某個值的話凡伊,下次函數(shù)調(diào)用時零渐,這個值保持不變。
一系忙、靜態(tài)局部變量:
1诵盼、 Static類內(nèi)部變量同auto自動變量(即未加 Static 聲明的局部變量)一樣,是某個特定函數(shù)的局部變量银还,即只能在定義該變量的函數(shù)內(nèi)使用該變量风宁,2者作用域相同;兩者的不同在于:auto自動變量會隨著函數(shù) 被調(diào)用和退出而存在和消失蛹疯,而static類局部變量不會戒财,它不管其所在的函數(shù)是否被調(diào)用,都將一直存在捺弦;不過饮寞,盡管該變量還繼續(xù)存在,但不能使用它列吼。倘 若再次調(diào)用定義它的函數(shù)時幽崩,它又可繼續(xù)使用,而且保存了前次被調(diào)用后留下的值寞钥。換言之慌申,Static類型的內(nèi)部變量是一種只能在某個特定函數(shù)中使用,但一 直占據(jù)存儲空間的變量凑耻。
2太示、函數(shù)體內(nèi)如果在定義靜態(tài)變量的同時進行了初始化柠贤,則以后程序不再進行初始化操作(出現(xiàn)在函數(shù)內(nèi)部的基本類型的的靜態(tài)變量初始化語句只有在第一次調(diào)用才執(zhí)行)。而對自動變量賦初值是在函數(shù)調(diào)用時進行类缤,每調(diào)用一次函數(shù)重新給一次初值臼勉,相當于執(zhí)行一次賦值語句。
3餐弱、靜態(tài)局部變量的初始化表達式必須是一個常量或者常量表達式宴霸。即使局部靜態(tài)變量定義時沒有賦初值,系統(tǒng)會自動賦初值0(對數(shù)值型變量)或空字符(對字符變量)膏蚓;靜態(tài)變量的初始值為0瓢谢。而對自動變量auto來說,如果不賦初值則它的值將是個不確定的值驮瞧。
4氓扛、當多次調(diào)用一個函數(shù)且要求在調(diào)用之間保留某些變量的值時,可考慮采用靜態(tài)局部變量论笔。雖然用全局變量也可以達到上述目的采郎,但全局變量有時會造成意外的副作用,因此仍以采用局部靜態(tài)變量為宜狂魔。
注:局部靜態(tài)變量占用內(nèi)存時間較長蒜埋,并且可讀性差,因此最楷,除非必要整份,盡量避免使用局部靜態(tài)變量。
二籽孙、靜態(tài)全局變量
全局變量(外部變量)的說明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量烈评。
全局變量本身就是靜態(tài)存儲方式,靜態(tài)全局變量當然也是靜態(tài)存儲方式蚯撩。
這兩者在存儲方式上并無不同础倍。
這兩者的區(qū)別雖在于:
1、非靜態(tài)全局變量的作用域是整個源程序胎挎,當一個源程序由多個源文件組成時沟启,非靜態(tài)的全局變量在各個源文件中都是有效的。
2犹菇、靜態(tài)全局變量則限制了其作用域德迹, 即只在定義該變量的源文件內(nèi)有效,在同一源程序的其它源文件(即聲明了該變量的CPP文件,或包含該變量聲明頭文件的CPP文件)中不能使用它揭芍。
由于靜態(tài)全局變量的作用域局限于一個源文件內(nèi)胳搞,只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其它源文件中引起錯誤。
從以上分析可以看出————
把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲方式肌毅,即改變了它的生存期筷转。
把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍悬而。
因此static這個說明符在不同的地方所起的作用是不同的呜舒。應(yīng)予以注意。
關(guān)于Static關(guān)鍵字
1.靜態(tài)變量笨奠,分配在靜態(tài)存儲區(qū)袭蝗,在數(shù)據(jù)段中。函數(shù)退出之后般婆,變量值不變到腥。
2.作用域,全局的靜態(tài)變量蔚袍、靜態(tài)函數(shù)只能在本文件中使用乡范。(不同于一般全局變量)
局部的靜態(tài)變量同函數(shù)的局部變量
五大內(nèi)存分區(qū)(貌似與編譯原理中不一樣,不過道理是一樣的,實際存在的東西總是會與理論有一定差距的)
1.在C++中,內(nèi)存分成5個區(qū)页响,他們分別是堆篓足、棧、自由存儲區(qū)闰蚕、全局/靜態(tài)存儲區(qū)和常量存儲區(qū)。
2.棧连舍,就是那些由編譯器在需要的時候分配没陡,在不需要的時候自動清除的變量的存儲區(qū)。里面的變量通常是局部變量索赏、函數(shù)參數(shù)等盼玄。
3.堆,就是那些由new分配的內(nèi)存塊潜腻,他們的釋放編譯器不去管埃儿,由我們的應(yīng)用程序去控制,一般一個new就要對應(yīng)一個delete融涣。如果程序員沒有釋放掉童番,那么在程序結(jié)束后,操作系統(tǒng)會自動回收威鹿。
4.自由存儲區(qū)剃斧,就是那些由malloc等分配的內(nèi)存塊,他和堆是十分相似的忽你,不過它是用free來結(jié)束自己的生命的幼东。
5.全局/靜態(tài)存儲區(qū),全局變量和靜態(tài)變量被分配到同一塊內(nèi)存中,在以前的C語言中根蟹,全局變量又分為初始化的和未初始化的脓杉,在C++里面沒有這個區(qū)分了,他們共同占用同一塊內(nèi)存區(qū)简逮。
6.常量存儲區(qū)球散,這是一塊比較特殊的存儲區(qū),他們里面存放的是常量买决,不允許修改(當然沛婴,你要通過非正當手段也可以修改,而且方法很多)