版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
模塊五函數(shù)的使用模塊學(xué)習(xí)目標(biāo)1.掌握函數(shù)的定義和分類;2.理解和掌握函數(shù)的參數(shù)和函數(shù)的值;3.掌握函數(shù)的調(diào)用方法(嵌套方法和遞歸方法);4.初步掌握利用C語言函數(shù)的使用。函數(shù)的分類函數(shù)的定義函數(shù)參數(shù)和函數(shù)的值函數(shù)的調(diào)用全局變量和局部變量變量的存儲(chǔ)類別函數(shù)的使用什么是函數(shù)?
在程序中完成某功能的模塊稱之為“函數(shù)”
所有C語言程序都是由一個(gè)或多個(gè)函數(shù)構(gòu)成的。當(dāng)程序規(guī)模小時(shí),可用一個(gè)源文件來實(shí)現(xiàn)。當(dāng)程序規(guī)模較大時(shí),可以由多個(gè)源文件組成,但其中只有一個(gè)源文件含有主函數(shù)main(),而其他源文件不能含有主函數(shù)。
程序由多個(gè)函數(shù)構(gòu)成時(shí),只能由主函數(shù)調(diào)用其他函數(shù),反之則不行。其他函數(shù)之間可以互相調(diào)用,同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù),前者稱為主調(diào)函數(shù);后者稱為被調(diào)函數(shù)。5.1函數(shù)的分類5.1.1庫函數(shù)和自定義函數(shù)(從用戶使用的角度)庫函數(shù):C語言自帶的函數(shù)稱為庫函數(shù)(LibraryFunction)。
例:printf、scanf、getchar、putchar、gets、puts、strcpy等函數(shù)。自定義函數(shù):用戶編寫的函數(shù)稱為自定義函數(shù)。注意:自定義函數(shù)和庫函數(shù)在編寫和使用方函數(shù)的分類解析評(píng)審專用式上完全相同,只是由不同的機(jī)構(gòu)來編寫。5.1函數(shù)的分類5.1.2無參函數(shù)與有參函數(shù)(從函數(shù)的形式)無參函數(shù):無參數(shù)的函數(shù),主調(diào)函數(shù)不向被調(diào)函數(shù)傳遞數(shù)據(jù)。執(zhí)行特定的功能,返回值可有可無,無返回值的情況居多。
例:intmax()\\括號(hào)當(dāng)中無參數(shù)有參函數(shù):有參數(shù)的函數(shù),主調(diào)函數(shù)通過參數(shù)向被調(diào)函數(shù)傳遞數(shù)據(jù)。有參函數(shù)在執(zhí)行被調(diào)函數(shù)時(shí)會(huì)得到一個(gè)值并返回給主調(diào)函數(shù)使用。
例:intmin(inta,intb)a、b即為函數(shù)參數(shù)5.1函數(shù)的分類實(shí)例:輸入兩個(gè)整數(shù),輸出其中較大的數(shù)#include<stdio.h>intmax(intx,inty){//函數(shù)的定義
if(x>y)returnx;
elsereturny;//使用return語句把結(jié)果返回主調(diào)函數(shù)
}voidmain(){
inta,b,c;
printf("inputtwonumbers:\n");
scanf("%d,%d",&a,&b);
c=max(a,b);//函數(shù)的調(diào)用
printf("max=%d\n",c);}5.1函數(shù)的分類5.1.3內(nèi)部函數(shù)與外部函數(shù)(從函數(shù)的作用范圍)內(nèi)部函數(shù):只能被本文件中的其他函數(shù)所調(diào)用的函數(shù)。在定義內(nèi)部函數(shù)時(shí),需在函數(shù)名和函數(shù)類型的前面加上關(guān)鍵字static。
格式:static類型標(biāo)識(shí)符函數(shù)名(形參表);
例:staticintfun(inta,intb);外部函數(shù):在定義函數(shù)時(shí),函數(shù)首部的最左端冠以關(guān)鍵字extern,則此函數(shù)是外部函數(shù),可供其他文件調(diào)用。
格式:extern類型標(biāo)識(shí)符函數(shù)名(形參表);
例:externintfun(inta,intb);5.1函數(shù)的分類實(shí)例:輸入兩個(gè)整數(shù),要求輸出其中的大者,用外部函數(shù)實(shí)現(xiàn)
/*******file1.c(文件1)*******/
#include<stdio.h>
intmain()
{
externintmax(int,int);//聲明在本函數(shù)中將要調(diào)用在其他文件中定義的max函數(shù)
inta,b;
scanf("%d,%d",&a,&b);
printf("themaxis%d",max(a,b));
return0;
}
/*******file2.c(文件2)*******/intmax(intx,inty)
{
intz;
z=x>y?x:y;
returnz;
}5.2函數(shù)的定義5.2.1無參函數(shù)的定義
格式:類型名函數(shù)名()//函數(shù)首部{函數(shù)體}或
類型名函數(shù)名(void)//函數(shù)首部{
函數(shù)體}
注意:函數(shù)首部的后面不能加分號(hào),它和函數(shù)體一起構(gòu)成完整的定義。5.2函數(shù)的定義5.2.1無參函數(shù)的定義
說明:類型名指定函數(shù)返回值的類型,省略時(shí),默認(rèn)函數(shù)返回值的類型為int,void表示函數(shù)沒有參數(shù)。函數(shù)體包含聲明部分和語句部分,聲明部分主要是變量的聲明或所調(diào)用函數(shù)的聲明,執(zhí)行部分由執(zhí)行語句組成,函數(shù)的功能正是由這些語句實(shí)現(xiàn)的。函數(shù)體可以既有聲明部分又有語句部分,也可以只有語句部分,還可以兩者皆無(空函數(shù))。調(diào)用空函數(shù)不產(chǎn)生任何有效操作。5.2函數(shù)的定義實(shí)例:無參函數(shù)調(diào)用#include<stdio.h>voidmain(){voidprintf();//無參函數(shù)printf的聲明voidmessage();//無參函數(shù)message的聲明printf();message();printf();}voidprintf(){printf("******\n");//無參函數(shù)printf的定義}voidmessage(){printf("Hello\n");//無參函數(shù)message的定義}
5.2函數(shù)的定義5.2.2有參函數(shù)的定義
格式:類型名函數(shù)名(形式參數(shù)列表)//函數(shù)首部
{
函數(shù)體
}
說明:有參函數(shù)比無參函數(shù)多了一項(xiàng)內(nèi)容,即形式參數(shù)列表。形式參數(shù)(簡稱形參)可以是各種類型的變量,各形式參數(shù)之間用逗號(hào)分隔。在進(jìn)行函數(shù)調(diào)用時(shí),調(diào)用函數(shù)將賦予這些形參實(shí)際的值。5.2函數(shù)的定義5.2.3空函數(shù)的定義
格式:類型名函數(shù)名(){
}
說明:函數(shù)體是空的,調(diào)用此函數(shù)時(shí),什么工作也不做。在程序設(shè)計(jì)中可根據(jù)需要確定若干模塊,分別由不同的函數(shù)實(shí)現(xiàn)。而在最初階段可只實(shí)現(xiàn)最基本的模塊,其他的模塊等待以后完成。這些未編寫好的函數(shù)先用空函數(shù)占一個(gè)位置,這樣寫的目的是使程序的結(jié)構(gòu)清晰,可讀性更好,便于以后擴(kuò)充維護(hù)。5.3函數(shù)參數(shù)和函數(shù)的值5.3.1參數(shù)
函數(shù)的一個(gè)明顯特征就是使用時(shí)帶括號(hào)(),有必要的話,括號(hào)中還要包含數(shù)據(jù)或變量,稱其為參數(shù)(Parameter)。參數(shù)是函數(shù)需要處理的數(shù)據(jù)。
形參(形式參數(shù))
在函數(shù)定義中出現(xiàn)的參數(shù)可看作一個(gè)占位符,它無數(shù)據(jù),只能等到函數(shù)被調(diào)用時(shí)接收傳遞進(jìn)來的數(shù)據(jù),所以稱其為形式參數(shù),簡稱形參。
實(shí)參(實(shí)際參數(shù))
函數(shù)被調(diào)用時(shí)給出的參數(shù)包含了實(shí)實(shí)在在的數(shù)據(jù),會(huì)被函數(shù)內(nèi)部的代碼使用,所以稱其為實(shí)際參數(shù),簡稱實(shí)參。形參和實(shí)參的功能是傳遞數(shù)據(jù),發(fā)生函數(shù)調(diào)用時(shí),實(shí)參的值會(huì)傳遞給形參。5.3函數(shù)參數(shù)和函數(shù)的值5.3.1參數(shù)
形參和實(shí)參的區(qū)別與聯(lián)系形參變量只在函數(shù)內(nèi)效,不能在函數(shù)外使用。實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,無論實(shí)參是何種類型的數(shù)據(jù),
在進(jìn)行函數(shù)調(diào)用時(shí)都必須有確定的值,以便把這些值傳遞給形參,所以應(yīng)該提前用賦值、輸入等辦法使實(shí)參獲得確定值。實(shí)參和形參在數(shù)量上、類型上和順序上必須嚴(yán)格保持一致,否則會(huì)發(fā)生“類型不匹配”的錯(cuò)誤。如能自動(dòng)類型轉(zhuǎn)換,或者強(qiáng)制類型轉(zhuǎn)換,那么實(shí)參類型也可以不同于形參類型。5.3函數(shù)參數(shù)和函數(shù)的值5.3.1參數(shù)
形參和實(shí)參的區(qū)別與聯(lián)系函數(shù)調(diào)用時(shí),數(shù)據(jù)傳遞為單向,即只能把實(shí)參的值傳遞給形參,而不能把形參的值反向地傳遞給實(shí)參。所以,在函數(shù)調(diào)用過程中,形參的值發(fā)生改變并不會(huì)影響實(shí)參。形參和實(shí)參雖然可以同名,但它們之間是相互獨(dú)立、互不影響的。實(shí)參與形參結(jié)合的原則。當(dāng)實(shí)參為常量、變量、表達(dá)式或數(shù)組元素時(shí),對(duì)應(yīng)的形參只能是變量名;當(dāng)實(shí)參為數(shù)組名時(shí),對(duì)應(yīng)的形參必須是同類型的數(shù)組名或指針變量。5.3函數(shù)參數(shù)和函數(shù)的值實(shí)例:計(jì)算從m加到n的值
#include<stdio.h>intsum(intm,intn){inti;for(i=m+1;i<=n;++i){m+=i;}returnm;}intmain(){inta,b,total;printf("Inputtwonumbers:");scanf("%d%d",&a,&b);total=sum(a,b);printf("a=%d,b=%d\n",a,b);printf("total=%d\n",total);return0;}
在這段代碼中,函數(shù)定義語句中的m、n是形參,函數(shù)調(diào)用語句中的a、b是實(shí)參。
通過scanf函數(shù)可以讀取用戶輸入的數(shù)據(jù),并賦值給a、b,在調(diào)用sum函數(shù)時(shí),實(shí)參a、b的值會(huì)分別傳遞給形參m、n。5.3函數(shù)參數(shù)和函數(shù)的值實(shí)例:如下所示更改上面的代碼,讓實(shí)參和形參同名#include<stdio.h>intsum(intm,intn){inti;for(i=m+1;i<=n;++i){m+=i;}returnm;}intmain(){intm,n,total;printf("Inputtwonumbers:");scanf("%d%d",&m,&n);total=sum(m,n);printf("m=%d,n=%d\n",m,n);printf("total=%d\n",total);return0;}
調(diào)用sum函數(shù)后,函數(shù)內(nèi)部的形參m的值已經(jīng)發(fā)生了變化,而函數(shù)外部的實(shí)參m的值依然保持不變,可見它們是相互獨(dú)立的兩個(gè)變量,除了傳遞參數(shù)的一瞬間,其他時(shí)候是沒有聯(lián)系的。5.3函數(shù)參數(shù)和函數(shù)的值5.3.2返回值
當(dāng)被調(diào)用函數(shù)完成功能后,可將處理的結(jié)果返回調(diào)用函數(shù),這種數(shù)據(jù)傳遞稱為函數(shù)的返回值。如果函數(shù)有返回值,則在函數(shù)體內(nèi)應(yīng)包含return語句。
格式:return(表達(dá)式);
或return表達(dá)式;
作用:將表達(dá)式的值返回給調(diào)用函數(shù),結(jié)束被調(diào)用函數(shù)的執(zhí)行,并將程序的控制權(quán)返回到調(diào)用它的函數(shù)。5.3函數(shù)參數(shù)和函數(shù)的值5.3.2返回值
注意
1.函數(shù)返回值的類型應(yīng)與函數(shù)的類型一致。如不一致,以函數(shù)類型為準(zhǔn),對(duì)返回值進(jìn)行類型轉(zhuǎn)換,然后傳遞給調(diào)用函數(shù)。2.一個(gè)函數(shù)可以有多個(gè)return語句,但只執(zhí)行其中一個(gè)。5.4函數(shù)的調(diào)用
函數(shù)的使用是通過函數(shù)調(diào)用實(shí)現(xiàn)的。所謂函數(shù)調(diào)用,就是調(diào)用函數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù)并將控制權(quán)交給被調(diào)用函數(shù),當(dāng)被調(diào)用函數(shù)執(zhí)行完成后,將執(zhí)行結(jié)果回傳給調(diào)用函數(shù)并交回控制權(quán),如下圖所示。5.4函數(shù)的調(diào)用
5.4.1函數(shù)調(diào)用的方式
在表達(dá)式中調(diào)用函數(shù)
當(dāng)函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這時(shí)要求函數(shù)必須返回一個(gè)確定的值,而這個(gè)值作為參加表達(dá)式運(yùn)算的一部分。例如:c=2*max(a,b);
函數(shù)語句調(diào)用
把函數(shù)的調(diào)用通過一條語句來實(shí)現(xiàn),這就稱為函數(shù)語句調(diào)用。函數(shù)語句調(diào)用是最常使用的調(diào)用函數(shù)的方式。例如:printf("****");
fun();5.4函數(shù)的調(diào)用
5.4.1函數(shù)調(diào)用的方式
把函數(shù)作為參數(shù)使用
函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)際參數(shù),即將函數(shù)返回值作為實(shí)際參數(shù)傳遞到函數(shù)中使用。例如:
m=max(a,max(b,c));
printf("%f\n",max(a,b));5.4函數(shù)的調(diào)用實(shí)例:求1!+3!+5!+…+19!(調(diào)用函數(shù))
#include<stdio.h>
floatfact(intn);
voidmain()
{
floatsum=0.0;
intk;
for(k=1;k<=19;k+=2)
sum=sum+fact(k);
printf("sum=%.1f\n",sum);}floatfact(intn){
inti;
floatt=1.0;
for(i=2;i<=n;i++)
t=t*i;
returnt;}5.4函數(shù)的調(diào)用
5.4.2函數(shù)的嵌套調(diào)用
函數(shù)的嵌套調(diào)用是指在調(diào)用一個(gè)函數(shù)的過程中,該函數(shù)又調(diào)用另一個(gè)函數(shù)。在C語言中,各函數(shù)均處于平等關(guān)系,任何一個(gè)函數(shù)都可以調(diào)用和被調(diào)用,但main函數(shù)例外。注意:C語言不允許嵌套定義函數(shù),如下圖所示5.4函數(shù)的調(diào)用實(shí)例:計(jì)算sum=1!+2!+3!+…+(n-1)!+n!#include<stdio.h>longfactorial(intn){//求階乘
inti;
longresult=1;
for(i=1;i<=n;i++){
result*=i;
}
returnresult;}longsum(longn){//求累加和
inti;
longresult=0;
for(i=1;i<=n;i++){//在定義過程中出現(xiàn)嵌套調(diào)用
}
returnresult;}intmain(){
printf("1!+2!+...+9!+10!=%ld\n",sum(10));//在調(diào)用過程中出現(xiàn)嵌套調(diào)用
return0;}5.4函數(shù)的調(diào)用
5.4.3函數(shù)的遞歸調(diào)用
一個(gè)函數(shù)除了可以調(diào)用其他函數(shù)以外,還可以直接或間接調(diào)用自己,這種函數(shù)自己調(diào)用自己的形式稱為函數(shù)的遞歸調(diào)用,帶有遞歸調(diào)用的函數(shù)也稱為遞歸函數(shù)。遞歸調(diào)用的方法是一種重要的程序設(shè)計(jì)方法,許多復(fù)雜問題可以很容易地使用遞歸調(diào)用方法得到解決,如:漢諾塔問題、求階乘等。5.4函數(shù)的調(diào)用實(shí)例:用遞歸調(diào)用的方法求n!#include<stdio.h>longfact(int);voidmain(){
intn;
longf;
printf("n=");
scanf("%d",&n);
f=fact(n);
printf("%d!=%d\n",n,f);}longfact(intn){
if(n==1)return1;
else
return(n*fact(n-1));/*遞歸結(jié)束條件*/}分析:5!=5×4×3×2×1,5!=5×4!,4!=4×3!,…,2!=2×1!,1!=1終止遞歸。遞歸公式:當(dāng)n==1時(shí),n!=1;當(dāng)n>1時(shí),n!=n×(n-1)!。遞歸終止條件為“if(n==1)return1;”5.4函數(shù)的調(diào)用實(shí)例:年齡問題(書本146頁)
#include<stdio.h>
intage(intn)
{
intx;
if(n==1)
x=10;
else
x=age(n-1)+2;
returnx;
}
intmain()
{
intn;
printf("請輸入n值:");
scanf("%d",&n);
printf("第%d個(gè)人的年齡為%d\n",n,age(n));
return0;
}5.4函數(shù)的調(diào)用
5.4.4
數(shù)組作為函數(shù)參數(shù)
數(shù)組可以作為函數(shù)的參數(shù)使用,完成函數(shù)間的數(shù)據(jù)傳遞。數(shù)組作為函數(shù)參數(shù)有兩種形式,一種是把數(shù)組元素作為實(shí)參使用,另一種是把數(shù)組名作為函數(shù)的形參和實(shí)參使用
數(shù)組元素作為函數(shù)實(shí)參
數(shù)組元素就是下標(biāo)變量,它與普通變量并無區(qū)別。因此,將數(shù)組元素作為函數(shù)實(shí)參使用與將普通變量作為函數(shù)實(shí)參使用是完全相同的。在發(fā)生函數(shù)調(diào)用時(shí),把作為實(shí)參的數(shù)組元素的值傳遞給形參,實(shí)現(xiàn)單向值的傳遞。5.4函數(shù)的調(diào)用
5.4.4
數(shù)組作為函數(shù)參數(shù)
數(shù)組名作為函數(shù)參數(shù)
數(shù)組名代表數(shù)組的首地址,數(shù)組名作為函數(shù)的參數(shù),此時(shí)形參和實(shí)參所指向的是同一塊存儲(chǔ)單元,即形參數(shù)組可以訪問實(shí)參數(shù)組所在的存儲(chǔ)單元,并且還能改變這些單元內(nèi)容,從而使實(shí)參數(shù)組元素的值被改變。這就是數(shù)組作為參數(shù)的真正含義。數(shù)組名作為函數(shù)參數(shù)調(diào)用函數(shù)的格式為函數(shù)名(數(shù)組名)。
注意:數(shù)組名后面不能有[]。由于數(shù)組名實(shí)際上是數(shù)組第一個(gè)元素的地址,調(diào)用函數(shù)時(shí),當(dāng)用數(shù)組名作為參時(shí),實(shí)際上傳遞給形參一個(gè)地址值,即實(shí)參數(shù)組的首地址,對(duì)應(yīng)的形參應(yīng)該是數(shù)組名或一個(gè)指針變量。5.4函數(shù)的調(diào)用
5.4.4
數(shù)組作為函數(shù)參數(shù)
數(shù)組名作為實(shí)參時(shí),f函數(shù)中對(duì)應(yīng)的形參可用以下3種形式進(jìn)行說明:
(1)f(intb[10]);(2)f(intb[]);(3)f(int*b)。
注意:形參數(shù)組的長度可以省略。為了在被調(diào)用函數(shù)中滿足處理數(shù)組元素的需要,可另設(shè)一個(gè)參數(shù),用來傳遞數(shù)組元素的個(gè)數(shù)。當(dāng)函數(shù)參數(shù)為一維數(shù)組時(shí),形參數(shù)組無需指定大小,但數(shù)組名后面的方括號(hào)是不能被省略的。也可用多維數(shù)組名作為實(shí)參和形參,在被調(diào)用函數(shù)中對(duì)形參數(shù)組進(jìn)行定義時(shí),可以指定每一維的長度,也可省略第一維的長度。例如,形參數(shù)組如下:inta[3][10];
正確inta[][10];
正確
inta[][];錯(cuò)誤
inta[3][];錯(cuò)誤5.4函數(shù)的調(diào)用
5.4.4
數(shù)組作為函數(shù)參數(shù)
函數(shù)參數(shù)傳遞的規(guī)則如圖所示5.4函數(shù)的調(diào)用實(shí)例:在一維數(shù)組score中存放10個(gè)學(xué)生的考試成績,求平均成績。
#include<stdio.h>
floataver(floata[10]);
voidmain()
{
floatscore[10]={100,87,62,93,67,98,95,82,89,90};
floataverage;
average=aver(score);
printf("平均分:%.1f\n",average);
}
floataver(floata[10])
{
inti;
floatav,sum=a[0];
for(i=1;i<10;i++)
sum=sum+a[i];
av=sum/10;
returnav;
}5.4函數(shù)的調(diào)用實(shí)例:調(diào)用函數(shù)sum求出數(shù)組a[3][3]主對(duì)角線元素及輔對(duì)角線元素之和。
#include<stdio.h>
sum(intx[][3]);
ints2;
voidmain()
{
inti,j,s1,a[3][3];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
s1=sum(a);
printf("%d,%d\n",s1,s2);
}
sum(intx[][3])
{
inti,s1=0;
for(i=0;i<3;i++)
{
s1=s1+x[i][i];
s2+=x[i][3-i-1];
}
returns1;
}5.5全局變量和局部變量
在函數(shù)定義的聲明部分可以定義變量,那么變量的定義是不是只能在函數(shù)中進(jìn)行?當(dāng)然不是,這就引出了一個(gè)新的概念:變量的作用域,也就是說不同位置定義變量,其作用域不一樣,變量的作用域就是變量的有效范圍。C語言只允許在3個(gè)地方定義變量:
函數(shù)內(nèi)部的聲明部分。所有函數(shù)的外部。復(fù)合語句中的聲明部分。
變量定義的位置不同,其作用域也不同。從變量的作用域來分,可以將其分為局部變量和全局變量。5.5全局變量和局部變量
5.5.1局部變量
在一個(gè)函數(shù)內(nèi)部定義的變量稱為局部變量。其作用范圍僅限于本函數(shù),即只在本函數(shù)范圍內(nèi)有效,在其他函數(shù)內(nèi)不能使用,如圖所示
5.5全局變量和局部變量
5.5.1局部變量
在main函數(shù)中定義的變量也只在主函數(shù)中有效,而不是在整個(gè)文件中都有效,主函數(shù)不能使用其他函數(shù)中定義的變量。不同函數(shù)中可使用相同名字的變量,它們代表不同的對(duì)象,互不干擾。形參是屬于被調(diào)函數(shù)的局部變量,實(shí)參是屬于調(diào)用函數(shù)的局部變量。在函數(shù)內(nèi)部,可在復(fù)合語句中定義變量,這個(gè)變量只在本復(fù)合語句中有效,如圖所示。
5.5全局變量和局部變量實(shí)例:寫出下列程序并運(yùn)行得到結(jié)果。
#include<stdio.h>
voidmain()
{
inti,a=0;
for(i=1;i<=2;i++)
{
inta=1;a++;//在復(fù)合語句內(nèi)開辟新的a
printf("i=%d,a=%d\n",i,a);
}//釋放復(fù)合語句內(nèi)開辟的a,不能再使用它
printf("i=%d,a=%d\n",i,a);
}5.5全局變量和局部變量
5.5.2全局變量
全局變量是在函數(shù)外部定義的變量,也稱為外部變量。其作用范圍是從其被定義的地方開始直至本源程序文件的結(jié)束。全局變量只能被定義在程序的最前面,即第一個(gè)函數(shù)的前面,其作用范圍將覆蓋源程序文件中的各函數(shù),如圖所示。
5.5全局變量和局部變量
5.5.2全局變量
優(yōu)點(diǎn)增加了各函數(shù)間數(shù)據(jù)傳遞的渠道。函數(shù)調(diào)用只能返回一個(gè)函數(shù)值,而利用全局變量則可以從函數(shù)中得到一個(gè)以上的返回值。
利用全局變量可以減少函數(shù)中實(shí)參和形參的個(gè)數(shù)。
缺點(diǎn)全局變量在程序運(yùn)行過程中始終占用存儲(chǔ)單元,而不是在函數(shù)被調(diào)用時(shí)才臨時(shí)分配存儲(chǔ)單元。使函數(shù)的通用性降低。因?yàn)楹瘮?shù)的運(yùn)行要依賴于全局變量,所以函數(shù)很難進(jìn)行移植。5.5全局變量和局部變量
5.5.2全局變量
缺點(diǎn)由于每個(gè)函數(shù)執(zhí)行時(shí)都有可能改變?nèi)肿兞康闹?,這就使得程序容易出錯(cuò),因此,非必要情況不建議使用全局變量。
在同一個(gè)源程序中,若全局變量與局部變量同名,則在局部變量的作用范圍內(nèi),全局變量不起作用,即此時(shí)全局變量被局部變量所“屏蔽”。在同一源文件內(nèi),對(duì)于使用在前,定義在后的全局變量,應(yīng)在使用前用關(guān)鍵字extern加以聲明,聲明后的全局變量即可使用。5.5全局變量和局部變量實(shí)例:判斷下列程序的運(yùn)行結(jié)果。
#include<stdio.h>
voidfun();
intn=5;//定義全局變量n
voidmain()
{
intm=n;
fun();
printf("m=%dn=%d\n",m,n);
}
voidfun()
{
ints=10;
n=s;
}5.6變量的存儲(chǔ)類別
前面討論了變量的作用域,那么在變量被定義后是否直到程序結(jié)束都一直有效呢?當(dāng)然不是,這就引出一個(gè)新的概念:變量的生命期。變量從定義開始分配存儲(chǔ)單元,到運(yùn)行結(jié)束存儲(chǔ)單元被回收,整個(gè)過程稱為變量生命期。影響變量生命期的是變量的存儲(chǔ)類型,也就是說變量的存儲(chǔ)類型不同,其生命期也是不同的。
5.6變量的存儲(chǔ)類別
5.6.1靜態(tài)存儲(chǔ)與動(dòng)態(tài)存儲(chǔ)
C語言的數(shù)據(jù)存儲(chǔ)區(qū)分為動(dòng)態(tài)存儲(chǔ)區(qū)和靜態(tài)存儲(chǔ)區(qū),全局變量和靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)區(qū),自動(dòng)變量屬于動(dòng)態(tài)存儲(chǔ)區(qū)。變量的存放位置決定了變量的生命期。從變量的生命期來分,可以將變量的存儲(chǔ)類型分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。
靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間根據(jù)需要給變量分配固定的存儲(chǔ)空間的方式。
動(dòng)態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間根據(jù)需要給變量動(dòng)態(tài)分配存儲(chǔ)空間的方式。
5.6變量的存儲(chǔ)類別
5.6.2變量的存儲(chǔ)類型
變量有兩個(gè)屬性,即前面已經(jīng)介紹過的變量的數(shù)據(jù)類型以及變量的存儲(chǔ)類型。用變量的存儲(chǔ)類型說明來確定變量的存放位置。
帶有存儲(chǔ)類型的變量,其定義的一般形式:存儲(chǔ)類型數(shù)據(jù)類型變量名;
在C語言中,變量的存儲(chǔ)類型有4種:auto(自動(dòng)類型)、static(靜態(tài)類型)、register(寄存器類型)和extern(外部類型)。
5.6變量的存儲(chǔ)類別
5.6.2變量的存儲(chǔ)類型
自動(dòng)變量(auto)
自動(dòng)變量用關(guān)鍵字auto表示。函數(shù)體中說明的變量、函數(shù)的參數(shù)、程序塊中定義的變量稱為自動(dòng)變量。其定義形式為:auto類型名變量名;自動(dòng)變量存放在動(dòng)態(tài)存儲(chǔ)區(qū),是動(dòng)態(tài)分配存儲(chǔ)空間的。C語言規(guī)定:在局部變量的定義中,可省略關(guān)鍵字“auto”,即沒有指明存儲(chǔ)類型的變量,一律隱含為自動(dòng)變量。5.6變量的存儲(chǔ)類別
5.6.2變量的存儲(chǔ)類型
靜態(tài)變量(static)
static變量的定義形式如下:static類型名變量名;
static變量的存儲(chǔ)單元被分配在數(shù)據(jù)存儲(chǔ)區(qū)的靜態(tài)存儲(chǔ)區(qū)中。如果函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后仍然能保留,便于下一次調(diào)用該函數(shù)時(shí)使用,可以將局部變量定義為static類型。局部變量和全局變量都可以說明為static類型。靜態(tài)局部變量的生存期與全局變量的生命期相同,作用域與局部變量的作用域相同。全局變量無論是否被說明為static類型,都將占用靜態(tài)存儲(chǔ)區(qū)。靜態(tài)局部變量可以改變其生命期,但不能改變它的作用域,即靜態(tài)局部變量不能被其他函數(shù)所引用,只是擴(kuò)大了局部變量的生命期。5.6變量的存儲(chǔ)類別實(shí)例:判斷下列程序的運(yùn)行結(jié)果。
#include<stdio.h>
voidf(intc)
{
inta=0;//每次調(diào)用時(shí),都會(huì)對(duì)變量a初始化,不保留上一次的值
staticintb=0;//只對(duì)靜態(tài)局部變量b初始化一次
a++;
b++;
printf("%d:a=%d,b=%d\n",c,a,b);
}
voidmain()
{
inti;
for(i=1;i<=2;i++)
f(i);//調(diào)用兩次函數(shù)
}5.6變量的存儲(chǔ)類別
5.6.2變量的存儲(chǔ)類型
寄存器變量(register)
register變量也是自動(dòng)變量,它與auto型變量的區(qū)別在于:register變量的值存放在寄存器中而不是內(nèi)存中。寄存器
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 嘉興中型倉庫租賃合同范例
- 魚排租賃合同范例
- 金康94合同范例
- 高校儀器銷售合同范例
- 鋼材營銷合同范例
- 糧油干貨供貨合同范例
- 2024-2025學(xué)年五年級(jí)下學(xué)期數(shù)學(xué)《分?jǐn)?shù)乘法(三)》(教案)
- 數(shù)字監(jiān)控合同范例
- 五年級(jí)上冊數(shù)學(xué)教案-1.5誰打電話的時(shí)間長(2)北師大版
- 單位客運(yùn)包車合同范例
- 2023年深圳市云端學(xué)校應(yīng)屆生招聘教師考試真題
- 2024年員工績效考核合同3篇
- 部編版五年級(jí)上冊道德與法治期末測試卷含答案精練
- 生產(chǎn)或營運(yùn)崗位招聘筆試題及解答(某大型央企)2024年
- 危險(xiǎn)化學(xué)品企業(yè)安全操作規(guī)程編制規(guī)范
- 2024高校大學(xué)《輔導(dǎo)員》招聘考試題庫(含答案)
- 國家開放大學(xué)《合同法》章節(jié)測試參考答案
- 2022年09月北京成人本科英語真題及答案
- 正當(dāng)防衛(wèi)制度課件
- JTG-G10-2016)公路工程施工監(jiān)理規(guī)范
- 卓越績效評(píng)價(jià)準(zhǔn)則實(shí)施指南
評(píng)論
0/150
提交評(píng)論