weidagang2046的專欄

          物格而后知致
          隨筆 - 8, 文章 - 409, 評(píng)論 - 101, 引用 - 0

          導(dǎo)航

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(12)

          隨筆檔案(8)

          文章分類(421)

          文章檔案(409)

          相冊(cè)

          Link

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          C變量與函數(shù)

          7.4   內(nèi)部變量與外部變量

          C語(yǔ)言中所有的變量都有自己的作用域。變量說(shuō)明的位置不同,其作用域也不同,據(jù)此將C語(yǔ)言中的變量分為內(nèi)部變量和外部變量。

          7.4.1  內(nèi)部變量

          7.4.2  外部變量

          7.4.1  內(nèi)部變量

          在一個(gè)函數(shù)內(nèi)部說(shuō)明的變量是內(nèi)部變量,它只在該函數(shù)范圍內(nèi)有效。

          也就是說(shuō),只有在包含變量說(shuō)明的函數(shù)內(nèi)部,才能使用被說(shuō)明的變量,在此函數(shù)之外就不能使用這些變量了。所以內(nèi)部變量也稱局部變量

          例如:

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

              {  int b,c

                  ……

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

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

             {  int y,z     

           ……

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

          main()

              { int m,n

                 ……

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

          關(guān)于局部變量的作用域還要說(shuō)明以下幾點(diǎn):

          1.主函數(shù)main()中定義的內(nèi)部變量,也只能在主函數(shù)中使用,其它函數(shù)不能使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義的內(nèi)部變量。因?yàn)橹骱瘮?shù)也是一個(gè)函數(shù),與其它函數(shù)是平行關(guān)系。這一點(diǎn)是與其它語(yǔ)言不同的,應(yīng)予以注意。

          2.形參變量也是內(nèi)部變量,屬于被調(diào)用函數(shù);實(shí)參變量,則是調(diào)用函數(shù)的內(nèi)部變量。

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

          4.在復(fù)合語(yǔ)句中也可定義變量,其作用域只在復(fù)合語(yǔ)句范圍內(nèi)。

          7.4.2  外部變量

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

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

          外部變量可被作用域內(nèi)的所有函數(shù)直接引用,所以外部變量又稱全局變量。

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

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

          /*功能:利用全局變量計(jì)算長(zhǎng)方體的體積及三個(gè)面的面積*/

          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();

                    }                                                              [程序演示]

          對(duì)于全局變量還有以下幾點(diǎn)說(shuō)明:

          1)外部變量可加強(qiáng)函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,但又使這些函數(shù)依賴這些外部變量,因而使得這些函數(shù)的獨(dú)立性降低。

          從模塊化程序設(shè)計(jì)的觀點(diǎn)來(lái)看這是不利的,因此不是非用不可時(shí),不要使用外部變量。

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

          3)外部變量的作用域是從定義點(diǎn)到本文件結(jié)束。如果定義點(diǎn)之前的函數(shù)需要引用這些外部變量時(shí),需要在函數(shù)內(nèi)對(duì)被引用的外部變量進(jìn)行說(shuō)明。外部變量說(shuō)明的一般形式為:

          extern  數(shù)據(jù)類型  外部變量[,外部變量2……]

          注意:外部變量的定義和外部變量的說(shuō)明是兩回事。外部變量的定義,必須在所有的函數(shù)之外,且只能定義一次。而外部變量的說(shuō)明,出現(xiàn)在要使用該外部變量的函數(shù)內(nèi),而且可以出現(xiàn)多次。

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

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

          int vs(int xl,int xw)

              { extern int xh                  /*外部變量xh的說(shuō)明*/

                 int v

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

                 return v

              }

          main()

              {  extern int xw,xh           /*外部變量的說(shuō)明*/

                  int xl=5                        /*內(nèi)部變量的定義*/

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

              }

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

                                                                  [程序演示]

          7.5   內(nèi)部函數(shù)和外部函數(shù)

                  當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),C語(yǔ)言根據(jù)函數(shù)能否被其它源文件中的函數(shù)調(diào)用,將函數(shù)分為內(nèi)部函數(shù)和外部函數(shù)。

          7.5.1  內(nèi)部函數(shù)(又稱靜態(tài)函數(shù))

          7.5.2  外部函數(shù)

          7.5.3  多個(gè)源程序文件的編譯和連接

          7.5.1  內(nèi)部函數(shù)(又稱靜態(tài)函數(shù))

          如果在一個(gè)源文件中定義的函數(shù),只能被本文件中的函數(shù)調(diào)用,而不能被同一程序其它文件中的函數(shù)調(diào)用,這種函數(shù)稱為內(nèi)部函數(shù)。

          定義一個(gè)內(nèi)部函數(shù),只需在函數(shù)類型前再加一個(gè)“static”關(guān)鍵字即可,如下所示:

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

                          {……}

          關(guān)鍵字“static”,譯成中文就是靜態(tài)的,所以內(nèi)部函數(shù)又稱靜態(tài)函數(shù)。但此處“static”的含義不是指存儲(chǔ)方式,而是指對(duì)函數(shù)的作用域僅局限于本文件。

          使用內(nèi)部函數(shù)的好處是:不同的人編寫不同的函數(shù)時(shí),不用擔(dān)心自己定義的函數(shù),是否會(huì)與其它文件中的函數(shù)同名,因?yàn)橥矝](méi)有關(guān)系。

          7.5.2  外部函數(shù)

          外部函數(shù)的定義:在定義函數(shù)時(shí),如果沒(méi)有加關(guān)鍵字“static”,或冠以關(guān)鍵字“extern”,表示此函數(shù)是外部函數(shù):

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

                                 {……}

          調(diào)用外部函數(shù)時(shí),需要對(duì)其進(jìn)行說(shuō)明:

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

          [案例7.11]  外部函數(shù)應(yīng)用。

          1)文件mainf.c

          main()

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

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

          }

          2)文件subf1.c

          ……

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

             {……}

          3)文件subf2.c

          ……

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

             {……}

          4)文件subf3.c

          ……

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

             {……}

          7.5.3  多個(gè)源程序文件的編譯和連接

          1)一般過(guò)程

          編輯各源文件 創(chuàng)建Project(項(xiàng)目)文件 設(shè)置項(xiàng)目名稱 編譯、連接,運(yùn)行,查看結(jié)果。

          2)創(chuàng)建Project(項(xiàng)目)文件

          用編輯源文件相同的方法,創(chuàng)建一個(gè)擴(kuò)展名為.PRJ的項(xiàng)目文件:該文件中僅包括將被編譯、連接的各源文件名,一行一個(gè),其擴(kuò)展名.C可以缺省;文件名的順序,僅影響編譯的順序,與運(yùn)行無(wú)關(guān)。

          注意:如果有某個(gè)(些)源文件不在當(dāng)前目錄下,則應(yīng)在文件名前冠以路徑

          3設(shè)置項(xiàng)目名稱

          打開菜單,選取ProjectProject name,輸入項(xiàng)目文件名即可。

          4)編譯、連接,運(yùn)行,查看結(jié)果

          與單個(gè)源文件相同。編譯產(chǎn)生的目標(biāo)文件,以及連接產(chǎn)生的可執(zhí)行文件,它們的主文件名,均與項(xiàng)目文件的主文件名相同。

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

          5)關(guān)于錯(cuò)誤跟蹤

          缺省時(shí),僅跟蹤當(dāng)前一個(gè)源程序文件。如果希望自動(dòng)跟蹤項(xiàng)目中的所有源文件,則應(yīng)將OptionsEnvironmentMessage Tracking開關(guān)置為“All files ”:連續(xù)按回車鍵,直至“All files”出現(xiàn)為止。此時(shí),滾動(dòng)消息窗口中的錯(cuò)誤信息時(shí),系統(tǒng)會(huì)自動(dòng)加載相應(yīng)的源文件到編輯窗口中。

          也可關(guān)閉跟蹤(“Message Tracking”置為“Off”)。此時(shí),只要定位于感興趣的錯(cuò)誤信息上,然后回車,系統(tǒng)也會(huì)自動(dòng)將相應(yīng)源文件加載到編輯窗口中。

          7.6   變量的動(dòng)態(tài)存儲(chǔ)與靜態(tài)存儲(chǔ)簡(jiǎn)介

          在C語(yǔ)言中,對(duì)變量的存儲(chǔ)類型說(shuō)明有以下四種:自動(dòng)變量(auto)、寄存器變量(register)、外部變量(extern)、靜態(tài)變量(static)。自動(dòng)變量和寄存器變量屬于動(dòng)態(tài)存儲(chǔ)方式,外部變量和靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ)方式。

          7.6.1  內(nèi)部變量的存儲(chǔ)方式

          7.6.2  外部變量的存儲(chǔ)方式

          7.6.1  內(nèi)部變量的存儲(chǔ)方式

          1.靜態(tài)存儲(chǔ)──靜態(tài)內(nèi)部變量

          1)定義格式: static  數(shù)據(jù)類型  內(nèi)部變量表;

          2)存儲(chǔ)特點(diǎn)

          1)靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ)。在程序執(zhí)行過(guò)程中,即使所在函數(shù)調(diào)用結(jié)束也不釋放。換句話說(shuō),在程序執(zhí)行期間,靜態(tài)內(nèi)部變量始終存在,但其它函數(shù)是不能引用它們的。

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

          3)何時(shí)使用靜態(tài)內(nèi)部變量

          1)需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值。

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

          2.動(dòng)態(tài)存儲(chǔ)──自動(dòng)局部變量(又稱自動(dòng)變量)

          1)定義格式:[auto]  數(shù)據(jù)類型  變量表        

          2)存儲(chǔ)特點(diǎn)

          1)自動(dòng)變量屬于動(dòng)態(tài)存儲(chǔ)方式。在函數(shù)中定義的自動(dòng)變量,只在該函數(shù)內(nèi)有效;函數(shù)被調(diào)用時(shí)分配存儲(chǔ)空間,調(diào)用結(jié)束就釋放。

          在復(fù)合語(yǔ)句中定義的自動(dòng)變量,只在該復(fù)合語(yǔ)句中有效;退出復(fù)合語(yǔ)句后,也不能再使用,否則將引起錯(cuò)誤。

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

          3)由于自動(dòng)變量的作用域和生存期,都局限于定義它的個(gè)體內(nèi)(函數(shù)或復(fù)合語(yǔ)句),因此不同的個(gè)體中允許使用同名的變量而不會(huì)混淆。即使在函數(shù)內(nèi)定義的自動(dòng)變量,也可與該函數(shù)內(nèi)部的復(fù)合語(yǔ)句中定義的自動(dòng)變量同名。

          建議:系統(tǒng)不會(huì)混淆,并不意味著人也不會(huì)混淆,所以盡量少用同名自動(dòng)變量!

          [案例7.13]自動(dòng)變量與靜態(tài)局部變量的存儲(chǔ)特性。

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

          void  auto_static(void)

             {  int var_auto=0;               /*自動(dòng)變量:每次調(diào)用都重新初始化*/

                 static int var_static=0;              /*靜態(tài)局部變量:只初始化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.寄存器存儲(chǔ)──寄存器變量

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

                    register   數(shù)據(jù)類型   變量表;

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

          2)對(duì)寄存器變量的實(shí)際處理,隨系統(tǒng)而異。例如,微機(jī)上的MSCTC 將寄存器變量實(shí)際當(dāng)作自動(dòng)變量處理。

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

          7.6.2  外部變量的存儲(chǔ)方式

          外部變量屬于靜態(tài)存儲(chǔ)方式:

          1)靜態(tài)外部變量──只允許被本源文件中的函數(shù)引用

          其定義格式為:  static  數(shù)據(jù)類型  外部變量表;

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

          定義時(shí)缺省static關(guān)鍵字的外部變量,即為非靜態(tài)外部變量。其它源文件中的函數(shù),引用非靜態(tài)外部變量時(shí),需要在引用函數(shù)所在的源文件中進(jìn)行說(shuō)明:

          extern  數(shù)據(jù)類型  外部變量表;

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

          靜態(tài)局部變量和靜態(tài)外部變量同屬靜態(tài)存儲(chǔ)方式,但兩者區(qū)別較大:

          1)定義的位置不同。靜態(tài)局部變量在函數(shù)內(nèi)定義,靜態(tài)外部變量在函數(shù)外定義。

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

          靜態(tài)外部變量在函數(shù)外定義,其作用域?yàn)槎x它的源文件內(nèi);生存期為整個(gè)源程序,但其它源文件中的函數(shù)也是不能使用它的。

              3)初始化處理不同。靜態(tài)局部變量,僅在第1次調(diào)用它所在的函數(shù)時(shí)被初始化,當(dāng)再次調(diào)用定義它的函數(shù)時(shí),不再初始化,而是保留上1次調(diào)用結(jié)束時(shí)的值。而靜態(tài)外部變量是在函數(shù)外定義的,不存在靜態(tài)內(nèi)部變量的重復(fù)初始化問(wèn)題,其當(dāng)前值由最近1次給它賦值的操作決定。

          務(wù)必牢記:把局部變量改變?yōu)殪o態(tài)內(nèi)部變量后,改變了它的存儲(chǔ)方式,即改變了它的生存期。把外部變量改變?yōu)殪o態(tài)外部變量后,改變了它的作用域,限制了它的使用范圍。因此,關(guān)鍵字“static”在不同的地方所起的作用是不同的。

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

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

          主站蜘蛛池模板: 克山县| 阿拉善盟| 安庆市| 新竹市| 平罗县| 莆田市| 道孚县| 蚌埠市| 灵川县| 施秉县| 瓦房店市| 江源县| 阿城市| 屏东市| 宽城| 南丹县| 新建县| 江山市| 饶阳县| 大关县| 新巴尔虎右旗| 江北区| 阿巴嘎旗| 蕉岭县| 娱乐| 新宁县| 白山市| 东兰县| 永昌县| 洪洞县| 贵阳市| 临潭县| 敖汉旗| 永春县| 丹巴县| 广南县| 河池市| 汉寿县| 建瓯市| 苍南县| 沭阳县|