weidagang2046的專欄

          物格而后知致
          隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
          數據加載中……

          C變量與函數

          7.4   內部變量與外部變量

          C語言中所有的變量都有自己的作用域。變量說明的位置不同,其作用域也不同,據此將C語言中的變量分為內部變量和外部變量。

          7.4.1  內部變量

          7.4.2  外部變量

          7.4.1  內部變量

          在一個函數內部說明的變量是內部變量,它只在該函數范圍內有效。

          也就是說,只有在包含變量說明的函數內部,才能使用被說明的變量,在此函數之外就不能使用這些變量了。所以內部變量也稱局部變量

          例如:

          int f1(int a)     /*函數f1*/

              {  int b,c;

                  ……

              }                  /*a,b,c作用域:僅限于函數f1()*/

          int f2(int x)     /*函數f2*/

             {  int y,z     

           ……

             }           /*x,y,z作用域:僅限于函數f2()*/

          main()

              { int m,n;

                 ……

              }                  /*m,n作用域:僅限于函數main()*/

          關于局部變量的作用域還要說明以下幾點:

          1.主函數main()中定義的內部變量,也只能在主函數中使用,其它函數不能使用。同時,主函數中也不能使用其它函數中定義的內部變量。因為主函數也是一個函數,與其它函數是平行關系。這一點是與其它語言不同的,應予以注意。

          2.形參變量也是內部變量,屬于被調用函數;實參變量,則是調用函數的內部變量。

          3.允許在不同的函數中使用相同的變量名,它們代表不同的對象,分配不同的單元,互不干擾,也不會發生混淆。

          4.在復合語句中也可定義變量,其作用域只在復合語句范圍內。

          7.4.2  外部變量

          在函數外部定義的變量稱為外部變量。以此類推,在函數外部定義的數組就稱為外部數組。

          外部變量不屬于任何一個函數,其作用域是:從外部變量的定義位置開始,到本文件結束為止。

          外部變量可被作用域內的所有函數直接引用,所以外部變量又稱全局變量。

              [案例7.9]  輸入長方體的長(l)、寬(w)、高(h),求長方體體積及正、側、頂三個面的面積。

          /*案例代碼文件名:AL7_9.C*/

          /*功能:利用全局變量計算長方體的體積及三個面的面積*/

          int s1,s2,s3;

          int vs(int a,int b,int c)

               {  int v;

                    v=a*b*c;  s1=a*b;  s2=b*c;  s3=a*c;

                   return  v;

                    }

              main()

                    {int v,l,w,h;

                      clrscr();

                      printf("\ninput length,width and height ");

                      scanf("%d%d%d",&l,&w,&h);

                      v=vs(l,w,h);

                     printf("v=%d    s1=%d    s2=%d    s3=%d\n",v,s1,s2,s3);

                     getch();

                    }                                                              [程序演示]

          對于全局變量還有以下幾點說明:

          1)外部變量可加強函數模塊之間的數據聯系,但又使這些函數依賴這些外部變量,因而使得這些函數的獨立性降低。

          從模塊化程序設計的觀點來看這是不利的,因此不是非用不可時,不要使用外部變量。

          2)在同一源文件中,允許外部變量和內部變量同名。在內部變量的作用域內,外部變量將被屏蔽而不起作用。

          3)外部變量的作用域是從定義點到本文件結束。如果定義點之前的函數需要引用這些外部變量時,需要在函數內對被引用的外部變量進行說明。外部變量說明的一般形式為:

          extern  數據類型  外部變量[,外部變量2……]

          注意:外部變量的定義和外部變量的說明是兩回事。外部變量的定義,必須在所有的函數之外,且只能定義一次。而外部變量的說明,出現在要使用該外部變量的函數內,而且可以出現多次。

          [案例7.10]  外部變量的定義與說明。

          /*案例代碼文件名:AL7_10.C*/

          int vs(int xl,int xw)

              { extern int xh;                  /*外部變量xh的說明*/

                 int v;

                 v=xl*xw*xh                 /*直接使用外部變量xh的值*/

                 return v;

              }

          main()

              {  extern int xw,xh;           /*外部變量的說明*/

                  int xl=5                        /*內部變量的定義*/

                  printf("xl=%d,xw=%d,xh=%d\nv=%d",xl,xw,xh,vs(xl,xw));

              }

          int xl=3,xw=4,xh=5;            /*外部變量xl、xwxh的定義*/

                                                                  [程序演示]

          7.5   內部函數和外部函數

                  當一個源程序由多個源文件組成時,C語言根據函數能否被其它源文件中的函數調用,將函數分為內部函數和外部函數。

          7.5.1  內部函數(又稱靜態函數)

          7.5.2  外部函數

          7.5.3  多個源程序文件的編譯和連接

          7.5.1  內部函數(又稱靜態函數)

          如果在一個源文件中定義的函數,只能被本文件中的函數調用,而不能被同一程序其它文件中的函數調用,這種函數稱為內部函數。

          定義一個內部函數,只需在函數類型前再加一個“static”關鍵字即可,如下所示:

          static  函數類型  函數名(函數參數表)

                          {……}

          關鍵字“static”,譯成中文就是靜態的,所以內部函數又稱靜態函數。但此處“static”的含義不是指存儲方式,而是指對函數的作用域僅局限于本文件。

          使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名,因為同名也沒有關系。

          7.5.2  外部函數

          外部函數的定義:在定義函數時,如果沒有加關鍵字“static”,或冠以關鍵字“extern”,表示此函數是外部函數:

          [extern]  函數類型  函數名(函數參數表)

                                 {……}

          調用外部函數時,需要對其進行說明:

          [extern]  函數類型  函數名(參數類型表)[,函數名2(參數類型表2)……];

          [案例7.11]  外部函數應用。

          1)文件mainf.c

          main()

          {  extern void input(…),process(…),output(…);         

              input(…);  process(…);  output(…);

          }

          2)文件subf1.c

          ……

          extern void input(……)                           /*定義外部函數*/

             {……}

          3)文件subf2.c

          ……

          extern void process(……)                      /*定義外部函數*/

             {……}

          4)文件subf3.c

          ……

          extern void output(……)                        /*定義外部函數*/

             {……}

          7.5.3  多個源程序文件的編譯和連接

          1)一般過程

          編輯各源文件 創建Project(項目)文件 設置項目名稱 編譯、連接,運行,查看結果。

          2)創建Project(項目)文件

          用編輯源文件相同的方法,創建一個擴展名為.PRJ的項目文件:該文件中僅包括將被編譯、連接的各源文件名,一行一個,其擴展名.C可以缺省;文件名的順序,僅影響編譯的順序,與運行無關。

          注意:如果有某個(些)源文件不在當前目錄下,則應在文件名前冠以路徑。

          3設置項目名稱

          打開菜單,選取ProjectProject name,輸入項目文件名即可。

          4)編譯、連接,運行,查看結果

          與單個源文件相同。編譯產生的目標文件,以及連接產生的可執行文件,它們的主文件名,均與項目文件的主文件名相同。

          注意:當前項目文件調試完畢后,應選取ProjectClear project,將其項目名稱從“Project name”中清除(清除后為空)。否則,編譯、連接和運行的,始終是該項目文件!

          5)關于錯誤跟蹤

          缺省時,僅跟蹤當前一個源程序文件。如果希望自動跟蹤項目中的所有源文件,則應將OptionsEnvironmentMessage Tracking開關置為“All files ”:連續按回車鍵,直至“All files”出現為止。此時,滾動消息窗口中的錯誤信息時,系統會自動加載相應的源文件到編輯窗口中。

          也可關閉跟蹤(“Message Tracking”置為“Off”)。此時,只要定位于感興趣的錯誤信息上,然后回車,系統也會自動將相應源文件加載到編輯窗口中。

          7.6   變量的動態存儲與靜態存儲簡介

          在C語言中,對變量的存儲類型說明有以下四種:自動變量(auto)、寄存器變量(register)、外部變量(extern)、靜態變量(static)。自動變量和寄存器變量屬于動態存儲方式,外部變量和靜態內部變量屬于靜態存儲方式。

          7.6.1  內部變量的存儲方式

          7.6.2  外部變量的存儲方式

          7.6.1  內部變量的存儲方式

          1.靜態存儲──靜態內部變量

          1)定義格式: static  數據類型  內部變量表;

          2)存儲特點

          1)靜態內部變量屬于靜態存儲。在程序執行過程中,即使所在函數調用結束也不釋放。換句話說,在程序執行期間,靜態內部變量始終存在,但其它函數是不能引用它們的。

          2)定義但不初始化,則自動賦以""(整型和實型)或'\0'(字符型);且每次調用它們所在的函數時,不再重新賦初值,只是保留上次調用結束時的值!

          3)何時使用靜態內部變量

          1)需要保留函數上一次調用結束時的值。

          2)變量只被引用而不改變其值。

          2.動態存儲──自動局部變量(又稱自動變量)

          1)定義格式:[auto]  數據類型  變量表;        

          2)存儲特點

          1)自動變量屬于動態存儲方式。在函數中定義的自動變量,只在該函數內有效;函數被調用時分配存儲空間,調用結束就釋放。

          在復合語句中定義的自動變量,只在該復合語句中有效;退出復合語句后,也不能再使用,否則將引起錯誤。

          2)定義而不初始化,則其值是不確定的。如果初始化,則賦初值操作是在調用時進行的,且每次調用都要重新賦一次初值。

          3)由于自動變量的作用域和生存期,都局限于定義它的個體內(函數或復合語句),因此不同的個體中允許使用同名的變量而不會混淆。即使在函數內定義的自動變量,也可與該函數內部的復合語句中定義的自動變量同名。

          建議:系統不會混淆,并不意味著人也不會混淆,所以盡量少用同名自動變量!

          [案例7.13]自動變量與靜態局部變量的存儲特性。

          /*案例代碼文件名:AL7_13.C*/

          void  auto_static(void)

             {  int var_auto=0;               /*自動變量:每次調用都重新初始化*/

                 static int var_static=0;              /*靜態局部變量:只初始化1*/

                 printf(“var_auto=%d, var_static=%d\n”, var_auto, var_static);

                 ++var_auto;

                 ++var_static;

               }

          main()

               {  int i;

                 for(i=0; i<5; i++) auto_static();

               }                                                               [程序演示]

          3.寄存器存儲──寄存器變量

          一般情況下,變量的值都是存儲在內存中的。為提高執行效率,C語言允許將局部變量的值存放到寄存器中,這種變量就稱為寄存器變量。定義格式如下:

                    register   數據類型   變量表;

          1)只有局部變量才能定義成寄存器變量,即全局變量不行。

          2)對寄存器變量的實際處理,隨系統而異。例如,微機上的MSCTC 將寄存器變量實際當作自動變量處理。

          3)允許使用的寄存器數目是有限的,不能定義任意多個寄存器變量。

          7.6.2  外部變量的存儲方式

          外部變量屬于靜態存儲方式:

          1)靜態外部變量──只允許被本源文件中的函數引用

          其定義格式為:  static  數據類型  外部變量表;

          2)非靜態外部變量──允許被其它源文件中的函數引用

          定義時缺省static關鍵字的外部變量,即為非靜態外部變量。其它源文件中的函數,引用非靜態外部變量時,需要在引用函數所在的源文件中進行說明:

          extern  數據類型  外部變量表;

          注意:在函數內的extern變量說明,表示引用本源文件中的外部變量!而函數外(通常在文件開頭)的extern變量說明,表示引用其它文件中的外部變量。

          靜態局部變量和靜態外部變量同屬靜態存儲方式,但兩者區別較大:

          1)定義的位置不同。靜態局部變量在函數內定義,靜態外部變量在函數外定義。

          2)作用域不同。靜態局部變量屬于內部變量,其作用域僅限于定義它的函數內;雖然生存期為整個源程序,但其它函數是不能使用它的。

          靜態外部變量在函數外定義,其作用域為定義它的源文件內;生存期為整個源程序,但其它源文件中的函數也是不能使用它的。

              3)初始化處理不同。靜態局部變量,僅在第1次調用它所在的函數時被初始化,當再次調用定義它的函數時,不再初始化,而是保留上1次調用結束時的值。而靜態外部變量是在函數外定義的,不存在靜態內部變量的重復初始化問題,其當前值由最近1次給它賦值的操作決定。

          務必牢記:把局部變量改變為靜態內部變量后,改變了它的存儲方式,即改變了它的生存期。把外部變量改變為靜態外部變量后,改變了它的作用域,限制了它的使用范圍。因此,關鍵字“static”在不同的地方所起的作用是不同的。

          from: http://other.mblogger.cn/posaidong/archive/07192005.aspx

          posted on 2005-08-11 09:41 weidagang2046 閱讀(546) 評論(0)  編輯  收藏 所屬分類: C/C++

          主站蜘蛛池模板: 台山市| 龙里县| 泰宁县| 烟台市| 吉林省| 丰宁| 镇安县| 龙游县| 灵山县| 游戏| 苍南县| 乃东县| 三原县| 铁岭县| 灌南县| 寿光市| 沂水县| 齐河县| 星子县| 嘉荫县| 英山县| 枞阳县| 山丹县| 同仁县| 探索| 通江县| 鄱阳县| 庄河市| 阿克陶县| 岚皋县| 濉溪县| 荣昌县| 普陀区| 阳信县| 额敏县| 苏尼特右旗| 从江县| 手游| 河津市| 友谊县| 罗源县|