隨筆-144  評(píng)論-80  文章-1  trackbacks-0
          在局部變量前加上“static”關(guān)鍵字,就成了靜態(tài)局部變量。靜態(tài)局部變量存放在內(nèi)存的全局?jǐn)?shù)據(jù)區(qū)。函數(shù)結(jié)束時(shí),靜態(tài)局部變量不會(huì)消失,每次該函數(shù)調(diào)用 時(shí),也不會(huì)為其重新分配空間。它始終駐留在全局?jǐn)?shù)據(jù)區(qū),直到程序運(yùn)行結(jié)束。靜態(tài)局部變量的初始化與全局變量類(lèi)似.如果不為其顯式初始化,則C++自動(dòng)為其 初始化為0。
          靜態(tài)局部變量與全局變量共享全局?jǐn)?shù)據(jù)區(qū),但靜態(tài)局部變量只在定義它的函數(shù)中可見(jiàn)。靜態(tài)局部變量與局部變量在存儲(chǔ)位置上不同,使得其存在的時(shí)限也不同,導(dǎo)致對(duì)這兩者操作 的運(yùn)行結(jié)果也不同。
          例如,下面的程序定義了全局變量、靜態(tài)局部變量和局部變量:
           //*********************
          //**   ch5_2.cpp  **
          //*********************

              #include <iostream.h>

              void func();
          int n=1; //全局變量

              void main()
          {
          static int a; // 靜態(tài)局部變量
          int b= -10; // 局部變量
          cout <<"a:" <<a
          <<" b:" <<b
          <<" n:" <<n <<endl;
          b+=4;
          func();
          cout <<"a:" <<a
          <<" b:" <<b
          <<" n:" <<n <<endl;
          n+=10;
          func();
          }

              void func()
          {
          static int a=2; // 靜態(tài)局部變量
          int b=5; // 局部變量
          a+=2;
          n+=12;
          b+=5;
          cout <<"a:" <<a
          <<" b:" <<b
          <<" n:" <<n <<endl;
          }

            運(yùn)行結(jié)果為:
              a:0 b:-10 n:l
          a:4 b:10 n:13
          a:0 b:-6 n:13
          a:6 b:10 n:35

          程序中主函數(shù)main()兩次調(diào)用了func()函數(shù),從運(yùn)行結(jié)果可以看出,程序控制每次進(jìn)入func()函數(shù)時(shí),局部變量b都被初始化。而靜態(tài)局部 變量a僅在第一次調(diào)用時(shí)被初始化,第二次進(jìn)入該函數(shù)時(shí),不再進(jìn)行初始化,這時(shí)它的值是第一次調(diào)用后的結(jié)果值4。 main()函數(shù)中的變量a和b與func()函數(shù)中的變量a和b空間位置是不一樣的,所以相應(yīng)的值也不一樣。關(guān)于變量作用域和可見(jiàn)性的進(jìn)一步討論見(jiàn)第6 章。
          靜態(tài)局部變量的用途有許多:可以使用它確定某函數(shù)是否被調(diào)用過(guò)。使用它保留多次調(diào)用的值。

          對(duì)靜態(tài)局部變量的說(shuō)明:
          (1) 靜態(tài)局部變量在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元。在程序整個(gè)運(yùn)行期間都不釋放。而自動(dòng)變量(即動(dòng)態(tài)局部變量)屬于動(dòng)態(tài)存儲(chǔ)類(lèi)別,存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)空間(而不是靜態(tài)存儲(chǔ)區(qū)空間),函數(shù)調(diào)用結(jié)束后即釋放。
          (2) 為靜態(tài)局部變量賦初值是在編譯時(shí)進(jìn)行值的,即只賦初值一次,在程序運(yùn)行時(shí)它已有初值。以后每次調(diào)用函數(shù)時(shí)不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時(shí)的 值。而為自動(dòng)變量賦初值,不是在編譯時(shí)進(jìn)行的,而是在函數(shù)調(diào)用時(shí)進(jìn)行,每調(diào)用一次函數(shù)重新給一次初值,相當(dāng)于執(zhí)行一次賦值語(yǔ)句。

          (3) 如果在定義局部變量時(shí)不賦初值的話,對(duì)靜態(tài)局部變量來(lái)說(shuō),編譯時(shí)自動(dòng)賦初值0(對(duì)數(shù)值型變量)或空字符(對(duì)字符型變量)。而對(duì)自動(dòng)變量來(lái)說(shuō),如果不賦初 值,則它的值是一個(gè)不確定的值。這是由于每次函數(shù)調(diào)用結(jié)束后存儲(chǔ)單元已釋放,下次調(diào)用時(shí)又重新另分配存儲(chǔ)單元,而所分配的單元中的值是不確定的。
          (4) 雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)是不能引用它的,也就是說(shuō),在其他函數(shù)中它是“不可見(jiàn)”的。

          posted on 2010-01-06 11:37 小力力力 閱讀(11013) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): C/C++
          主站蜘蛛池模板: 汕尾市| 泾阳县| 黄梅县| 慈溪市| 大理市| 庆安县| 澄城县| 饶河县| 来安县| 府谷县| 大宁县| 西青区| 昭苏县| 静宁县| 临潭县| 双桥区| 大田县| 房山区| 凯里市| 依安县| 买车| 青海省| 高州市| 白城市| 龙里县| 瑞昌市| 麻栗坡县| 太仓市| 陕西省| 通州区| 新泰市| 师宗县| 宁晋县| 灵璧县| 合川市| 北碚区| 长顺县| 扶绥县| 安宁市| 奉节县| 蕲春县|