C程序設(shè)計課件5.9-5.11_第1頁
C程序設(shè)計課件5.9-5.11_第2頁
C程序設(shè)計課件5.9-5.11_第3頁
C程序設(shè)計課件5.9-5.11_第4頁
C程序設(shè)計課件5.9-5.11_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

變量分類:從作用域的角度,變量分為局部變量和全局變量。變量的作用域:指變量在程序中起作用的范圍。決定變量作用域的因素:變量定義位置、存儲類別。變量作用域種類:整個程序一個文件一個函數(shù)一個小程序段局部變量:在函數(shù)內(nèi)部定義的變量,也稱內(nèi)部變量。作用域:定義它的函數(shù)內(nèi)部。1.局部變量①在main()中定義的變量也是局部變量,只在main()中有效。②形式參數(shù)是局部變量,只在它所在函數(shù)中有效。③在復(fù)合語句中可以定義變量,只在它所在復(fù)合語句中有效。④不同函數(shù)中定義的局部變量可以同名,它們代表不同對象,互不干擾。說明#include<stdio.h>intadd(){

c=a+b;return(c);}voidmain(){

a=1,b=2;c=add(a,b);

{

printf("a=%d,b=%d,c=%d\n",a,b,c);

}printf("a=%d,b=%d,c=%d",a,b,c);}a,b,c作用域a,b,c作用域c作用域運行結(jié)果

a=1,b=2,c=5a=1,b=2,c=3add_aadd_badd_cmain_amain_bmain_c121233c5【例】寫出下列程序的運行結(jié)果。inta,b,c;inta,intbintc=5;intc;程序1?2.全局變量

全局變量:在函數(shù)外部定義的變量,又稱外部變量。作用域:從定義點到文件尾。①在同一源文件中,全局變量和局部變量可以同名,但在局部變量的作用域內(nèi),與局部變量同名的全局變量不起作用。②全局變量增加了函數(shù)之間的聯(lián)系。同一源文件中所有函數(shù)都能使用全局變量,利用全局變量可使函數(shù)得到一個以上的返回值。③全局變量不宜過多,建議在不必要時不要使用全局變量。降低了程序的通用性增加了程序的調(diào)試難度降低了程序的清晰性說明#include<stdio.h>intx=20,y=-15;fun(

){

z=x>y?x:y;returnz;}voidmain(){

z=

fun(x,y);printf("%d,%d,%d\n",x,y,z);}運行結(jié)果20,40,4020-15fun_xfun_y40main_y【例】寫出下列程序的運行結(jié)果。xy4020fun_zmain_zx,y,z作用域y,z作用域x,y作用域intx,intyint

z;int

y=40,z;4040程序2?【例】10個學(xué)生成績,計算平均分、最高分和最低分。#include<stdio.h>#defineN10/*學(xué)生數(shù)*/floatmax,min;/*定義全局變量*/floataverage(floatarray[],intn){inti;floatave;

max=min=array[0];ave=0;for(i=0;i<n;i++){ave+=array[i];if(max<array[i])max=array[i];if(min>array[i])min=array[i];

}ave/=n;returnave;}voidmain(){intj;floata[N],ave;for(j=0;j<N;j++)scanf("%f",a+j);ave=average(a,N);printf("%f,%f,%f\n",ave,max,min);}/*功能函數(shù)(最大值和最小值利用全局變量帶回,平均值利用return語句返回)*//*主函數(shù)*/程序3?/*輸入成績*//*調(diào)用功能函數(shù)*//*輸出*/變量的存儲類別(2)變量生存期:變量占用內(nèi)存的時間(3)變量分類從生存期角度:分為靜態(tài)存儲、動態(tài)存儲。(1)C程序的存儲程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)數(shù)據(jù)區(qū)1.變量存儲(4)靜態(tài)存儲生存期:整個程序運行期。在編譯時分配存儲單元并初始化,程序運行期間不再初始化。(5)動態(tài)存儲生存期:所在函數(shù)執(zhí)行期。函數(shù)調(diào)用開始分配存儲單元,函數(shù)調(diào)用結(jié)束釋放其所占內(nèi)存單元。所在函數(shù)被調(diào)用一次就重新分配一次存儲單元,并重新初始化。(6)變量屬性

變量有數(shù)據(jù)類型和存儲類別兩個屬性變量定義形式為

[存儲類別]數(shù)據(jù)類型變量名(7)變量存儲類別

①自動型(auto)②寄存器型(register)③靜態(tài)型(static)④外部型(extern)(8)變量存儲類別的作用①決定變量在何處(內(nèi)存或通用寄存器)存儲?若在內(nèi)存,

又在什么存儲區(qū)域(動態(tài)存儲區(qū)或靜態(tài)存儲區(qū))?②決定變量的生存期。2.局部變量的存儲類別(1)自動變量(auto)定義形式

[auto]數(shù)據(jù)類型變量名若省略存儲類別,系統(tǒng)默認為auto。如:fun(intx,inty){autointz;

z=x>y?x:y;returnz;}①每次函數(shù)調(diào)用開始,為自動型局部變量重新分配內(nèi)存;每次函數(shù)調(diào)用結(jié)束,釋放為自動型局部變量分配的內(nèi)存。說明②若沒有初始化,其值不確定;若已初始化,每次調(diào)用重新賦初值。定義位置:函數(shù)內(nèi)部或形參列表中。作用域:所在的函數(shù)或復(fù)合語句內(nèi)部。存放位置:動態(tài)存儲區(qū)。生存期:函數(shù)調(diào)用開始,為其分配存儲空間,函數(shù)調(diào)用結(jié)束,立即釋放。#include"stdio.h"intfac(

){f=f*n;returnf;}voidmain(){for(i=1;i<=3;i++){printf("k=%d\n",k);}}運行結(jié)果

k=1

k=2

k=3

/*n是自動型局部變量*//*f是自動型局部變量*//*i,k是自動型局部變量*/n【例】寫出下列程序的運行結(jié)果。f1i1inti,k;intf=1;intnk=fac(i);k111nf12222nf13333程序4?(2)靜態(tài)型局部變量定義形式

static數(shù)據(jù)類型變量名

如:fun(intn){staticintf=1;returnf*n;}定義位置:函數(shù)內(nèi)部。作用域:定義它的函數(shù)或復(fù)合語句內(nèi)部。存放位置:靜態(tài)存儲區(qū)。生存期:整個程序運行期。①形參的存儲類別不能為static型。②靜態(tài)變量在編譯階段分配內(nèi)存并初始化。③若靜態(tài)型變量沒初始化,則系自動初始化(數(shù)值型為0,字符型為'\0')。④函數(shù)調(diào)用結(jié)束后不釋放內(nèi)存,函數(shù)再次被調(diào)用時,不再重新分配內(nèi)存,變量值是上次函數(shù)調(diào)用之后的結(jié)果。⑤程序運行結(jié)束,釋放為變量分配的存儲空間。說明6#include"stdio.h"intfac(

){f=f*n;returnf;}voidmain(){for(i=1;i<=3;i++){printf("k=%d\n",k);}}運行結(jié)果

k=1

k=2

k=6n【例】寫出下列程序的運行結(jié)果。f1i1inti,k;staticintf=1;intnk=fac(i);k11n2222n363程序5?/*n是自動型局部變量*//*f是靜態(tài)型局部變量*//*i,k是自動型局部變量*/閱讀下列程序,寫出運行結(jié)果。#include"stdio.h"voidfun(){intv1=0;staticintv2;printf("v1=%d,v2=%d\n",v1,v2);++v1;++v2;}voidmain(){inti;for(i=0;i<5;i++)fun();} 思考題程序6?(3)寄存器型局部變量C語言中,允許將局部變量的值放在CPU的通用寄存器中,從而提高程序的執(zhí)行效率。定義形式

register數(shù)據(jù)類型變量名如:fun(register

intx,inty){registerintz;

z=x>y?x:y;returnz;}①auto型局部變量可以說明為寄存器型變量,但static型局部變量不可以說明為寄存器型變量。②由于寄存器數(shù)量很少,不能保證定義的寄存器型變量總能分配到寄存器,此時作為auto型變量處理。說明存放位置:CPU通用寄存器。定義位置:同auto型(函數(shù)內(nèi)部和形參列表中)。作用域:同auto型(所在的函數(shù)或復(fù)合語句內(nèi)部)。生存期:同auto型(函數(shù)或復(fù)合語句的執(zhí)行期)。3.全局變量的存儲類別定義位置:函數(shù)外部。存儲位置:靜態(tài)存儲區(qū)。生存期:整個程序運行期。作用域①從定義點開始到它所在的程序文件尾。②通過引用聲明擴展全局變量作用域。只在它所在的程序文件內(nèi)擴展——靜態(tài)型全局變量可向它所在的程序文件外擴展——外部型全局變量引用聲明的形式extern數(shù)據(jù)類型變量名;(1)靜態(tài)型全局變量定義形式

static數(shù)據(jù)類型變量名;定義位置:函數(shù)外部作用域:從定義點開始到它所在的程序文件尾。通過引用聲明,可以擴展靜態(tài)型全局變量的作用域,此時該全局變量的作用域的起始點從定義點擴展到聲明處。如:staticinta=10;fun(intx,inty){intb=20,m;m=a+b+x*y;returnm;}①若靜態(tài)型全局變量沒有初始化,則系自動初始化(數(shù)值型變量值為0,字符型變量值為為'\0')。②靜態(tài)型全局變量只能被它所在文件中的函數(shù)使用,不能被其他文件中的函數(shù)使用。存放位置:靜態(tài)存儲區(qū)。生存期:整個程序運行期。說明#include"stdio.h"#defineN10/*學(xué)生數(shù)*/externfloatmax,min;/*靜態(tài)型全局變量引用說明*/floataverage(floatarray[],intn){inti;floatave=0.0;max=min=array[0];for(i=0;i<n;i++){ave+=array[i];if(max<array[i])max=array[i];if(min>array[i])min=array[i];}ave/=n;returnave;}voidmain(){intj;floata[N],ave;for(j=0;j<N;j++)scanf("%f",&a[j]);ave=average(a,N);printf("ave=%f,max=%f,min=%f\n",ave,max,min);}【例】10個學(xué)生成績,計算平均分、最高分和最低分。

作用域staticfloatmax,min;/*定義靜態(tài)型全局變量*//*功能函數(shù)(最大值和最小值利用靜態(tài)型全局變量帶回,平均值利用return語句返回)*//*主函數(shù)*/(2)外部型全局變量外部型全局變量既能被它所在文件中的函數(shù)使用,也能被其他文件中函數(shù)使用。定義形式

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

如:inta,b=5;fun(intx){a=b+x*x;}定義位置:函數(shù)外部。作用域:從定義點開始到它所在的程序文件尾。通過引用聲明,外部型全局變量的作用域可以擴展到定義它之前的函數(shù),也可以擴展到程序中的其他文件。存放位置:靜態(tài)存儲區(qū)。生存期:整個程序運行期。【例】寫出下列程序的運行結(jié)果。#include"stdio.h"intx=10,y=10;/*定義外部型全局變量*/externvoidsub();

/*函數(shù)引用說明*/voidadd(){y=10+x;x*=2;printf("add:y=%d\n",y);}voidmain(){add();sub();printf("main:x=%d,main:y=%d\n",x,y);}#include"stdio.h"externintx;/*外部變量引用說明*/voidsub()

/*函數(shù)定義*/{x-=y;printf("sub:y=%d\n",y);}file1.cfile2.c運行結(jié)果add:y=25sub:y=5main:x=25;main:y=10inty=5;x+=5;inty=5;10xy10add_y5sub_y515253025程序7?局部(內(nèi)部)變量全局(外部)變量存儲類別autoregister局部static全局static外部型存儲方式動態(tài)存儲靜態(tài)存儲存儲區(qū)動態(tài)存儲區(qū)寄存器靜態(tài)存儲區(qū)生存期函數(shù)調(diào)用開始至結(jié)束整個程序運行期間作用域定義變量的函數(shù)或復(fù)合語句內(nèi)所在文件其它文件初始化每次函數(shù)調(diào)用時編譯時,只一次未初始化不確定自動賦初值0或'\0'局部變量默認為auto型register型變量個數(shù)受限局部static變量具有全局壽命和局部可見性局部static變量具有繼承性extern不能用于變量定義,可擴展外部變量作用域變量存儲類別總結(jié)內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)定義形式static[返回值類型]函數(shù)名([形式參數(shù)表])

{函數(shù)體語句序列}①內(nèi)部函數(shù)只能被它所在文件中的函數(shù)調(diào)用,不能被其他文件中的函數(shù)調(diào)用。②不同文件中的內(nèi)部函數(shù)可以同名,互不干擾。

1.內(nèi)部函數(shù)(靜態(tài)函數(shù))如:staticintfun(inta,intb){return(a>b?a:b);}說明①外部函數(shù)既能被它所在文件中的函數(shù)調(diào)用,也能被其他文件中的函數(shù)調(diào)用。②如果一個文件要調(diào)用另一個文件中定義的函數(shù),在需要調(diào)用函數(shù)的文件中對所調(diào)用的外部函數(shù)作引用聲明。外部函數(shù)定義形式[extern][返回值類型]函數(shù)名([形式參數(shù)表])

{函數(shù)體語句序列}2.外部函數(shù)如:externintfun(inta,intb){return(a>b?a:b);}說明【例】內(nèi)部函數(shù)和外部函數(shù)舉例。#include"stdio.h"intx=10,y=10;/*定義外部型全局變量*/externvoidsub();/*函數(shù)引用說明*/staticvoidadd()/*內(nèi)部函數(shù)定義*/{inty=5;y=10+x;x*=2;printf("add:y=%d\n",y);}voidmain(){x+=5;add();sub();printf("main:x=%d,main:y=%d\n",x,y);}#include"stdio.h"externintx;/*變量引用說明*/voidsub()/*外部函數(shù)定義*/{inty=5;x-=y;printf("sub:y=%d\n",y);}file1.cfile2.cstaticexternerror:unresolvedexternalsymbol_sub1.以下說法中不正確的是()。

不同的函數(shù)中可以使用相同名字的變量

主函數(shù)main()中定義的變量在整個文件或程序中有效

形式參數(shù)是局部變量

在一個函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效2.以下說法中正確的是()。

①形參可以使用的存儲類說明符與局部變量完全相同

②全局變量說明為static存儲類別,其作用域?qū)⒈粩U大

③任何存儲類別的變量在未賦初值時,其值都是不確定的

④局部變量說明為static存儲類別,其生存期將得到延長練習(xí)題一、單項選擇題②④3.下列對靜態(tài)局部變量的敘述中,不正確的是()。

靜態(tài)局部變量占用的內(nèi)存在整個程序運行期間都不釋放

靜態(tài)局部變量是在編譯時賦初值的,故它只能被初始化一次

在一個函數(shù)中定義的靜態(tài)局部變量可以被另一個函數(shù)使用

數(shù)值型靜態(tài)局部變量的初值默認為04.下面關(guān)于全局變量的描述中,錯誤的是(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論