C語(yǔ)言程序設(shè)計(jì)項(xiàng)目化教程課件-模塊5_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)項(xiàng)目化教程課件-模塊5_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)項(xiàng)目化教程課件-模塊5_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)項(xiàng)目化教程課件-模塊5_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)項(xiàng)目化教程課件-模塊5_第5頁(yè)
已閱讀5頁(yè),還剩51頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

模塊五函數(shù)的使用模塊學(xué)習(xí)目標(biāo)1.掌握函數(shù)的定義和分類;2.理解和掌握函數(shù)的參數(shù)和函數(shù)的值;3.掌握函數(shù)的調(diào)用方法(嵌套方法和遞歸方法);4.初步掌握利用C語(yǔ)言函數(shù)的使用。函數(shù)的分類函數(shù)的定義函數(shù)參數(shù)和函數(shù)的值函數(shù)的調(diào)用全局變量和局部變量變量的存儲(chǔ)類別函數(shù)的使用什么是函數(shù)?

在程序中完成某功能的模塊稱之為“函數(shù)”

所有C語(yǔ)言程序都是由一個(gè)或多個(gè)函數(shù)構(gòu)成的。當(dāng)程序規(guī)模小時(shí),可用一個(gè)源文件來(lái)實(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庫(kù)函數(shù)和自定義函數(shù)(從用戶使用的角度)庫(kù)函數(shù):C語(yǔ)言自帶的函數(shù)稱為庫(kù)函數(shù)(LibraryFunction)。

例:printf、scanf、getchar、putchar、gets、puts、strcpy等函數(shù)。自定義函數(shù):用戶編寫(xiě)的函數(shù)稱為自定義函數(shù)。注意:自定義函數(shù)和庫(kù)函數(shù)在編寫(xiě)和使用方函數(shù)的分類解析評(píng)審專用式上完全相同,只是由不同的機(jī)構(gòu)來(lái)編寫(xiě)。5.1函數(shù)的分類5.1.2無(wú)參函數(shù)與有參函數(shù)(從函數(shù)的形式)無(wú)參函數(shù):無(wú)參數(shù)的函數(shù),主調(diào)函數(shù)不向被調(diào)函數(shù)傳遞數(shù)據(jù)。執(zhí)行特定的功能,返回值可有可無(wú),無(wú)返回值的情況居多。

例:intmax()\\括號(hào)當(dāng)中無(wú)參數(shù)有參函數(shù):有參數(shù)的函數(shù),主調(diào)函數(shù)通過(guò)參數(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語(yǔ)句把結(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無(wú)參函數(shù)的定義

格式:類型名函數(shù)名()//函數(shù)首部{函數(shù)體}或

類型名函數(shù)名(void)//函數(shù)首部{

函數(shù)體}

注意:函數(shù)首部的后面不能加分號(hào),它和函數(shù)體一起構(gòu)成完整的定義。5.2函數(shù)的定義5.2.1無(wú)參函數(shù)的定義

說(shuō)明:類型名指定函數(shù)返回值的類型,省略時(shí),默認(rèn)函數(shù)返回值的類型為int,void表示函數(shù)沒(méi)有參數(shù)。函數(shù)體包含聲明部分和語(yǔ)句部分,聲明部分主要是變量的聲明或所調(diào)用函數(shù)的聲明,執(zhí)行部分由執(zhí)行語(yǔ)句組成,函數(shù)的功能正是由這些語(yǔ)句實(shí)現(xiàn)的。函數(shù)體可以既有聲明部分又有語(yǔ)句部分,也可以只有語(yǔ)句部分,還可以兩者皆無(wú)(空函數(shù))。調(diào)用空函數(shù)不產(chǎn)生任何有效操作。5.2函數(shù)的定義實(shí)例:無(wú)參函數(shù)調(diào)用#include<stdio.h>voidmain(){voidprintf();//無(wú)參函數(shù)printf的聲明voidmessage();//無(wú)參函數(shù)message的聲明printf();message();printf();}voidprintf(){printf("******\n");//無(wú)參函數(shù)printf的定義}voidmessage(){printf("Hello\n");//無(wú)參函數(shù)message的定義}

5.2函數(shù)的定義5.2.2有參函數(shù)的定義

格式:類型名函數(shù)名(形式參數(shù)列表)//函數(shù)首部

函數(shù)體

說(shuō)明:有參函數(shù)比無(wú)參函數(shù)多了一項(xiàng)內(nèi)容,即形式參數(shù)列表。形式參數(shù)(簡(jiǎn)稱形參)可以是各種類型的變量,各形式參數(shù)之間用逗號(hào)分隔。在進(jìn)行函數(shù)調(diào)用時(shí),調(diào)用函數(shù)將賦予這些形參實(shí)際的值。5.2函數(shù)的定義5.2.3空函數(shù)的定義

格式:類型名函數(shù)名(){

}

說(shuō)明:函數(shù)體是空的,調(diào)用此函數(shù)時(shí),什么工作也不做。在程序設(shè)計(jì)中可根據(jù)需要確定若干模塊,分別由不同的函數(shù)實(shí)現(xiàn)。而在最初階段可只實(shí)現(xiàn)最基本的模塊,其他的模塊等待以后完成。這些未編寫(xiě)好的函數(shù)先用空函數(shù)占一個(gè)位置,這樣寫(xiě)的目的是使程序的結(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è)占位符,它無(wú)數(shù)據(jù),只能等到函數(shù)被調(diào)用時(shí)接收傳遞進(jìn)來(lái)的數(shù)據(jù),所以稱其為形式參數(shù),簡(jiǎn)稱形參。

實(shí)參(實(shí)際參數(shù))

函數(shù)被調(diào)用時(shí)給出的參數(shù)包含了實(shí)實(shí)在在的數(shù)據(jù),會(huì)被函數(shù)內(nèi)部的代碼使用,所以稱其為實(shí)際參數(shù),簡(jiǎn)稱實(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ù)等,無(wú)論實(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)用過(guò)程中,形參的值發(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ù)定義語(yǔ)句中的m、n是形參,函數(shù)調(diào)用語(yǔ)句中的a、b是實(shí)參。

通過(guò)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的值依然保持不變,可見(jiàn)它們是相互獨(dú)立的兩個(gè)變量,除了傳遞參數(shù)的一瞬間,其他時(shí)候是沒(méi)有聯(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語(yǔ)句。

格式: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語(yǔ)句,但只執(zhí)行其中一個(gè)。5.4函數(shù)的調(diào)用

函數(shù)的使用是通過(guò)函數(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ù)語(yǔ)句調(diào)用

把函數(shù)的調(diào)用通過(guò)一條語(yǔ)句來(lái)實(shí)現(xiàn),這就稱為函數(shù)語(yǔ)句調(diào)用。函數(shù)語(yǔ)句調(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ù)的過(guò)程中,該函數(shù)又調(diào)用另一個(gè)函數(shù)。在C語(yǔ)言中,各函數(shù)均處于平等關(guān)系,任何一個(gè)函數(shù)都可以調(diào)用和被調(diào)用,但main函數(shù)例外。注意:C語(yǔ)言不允許嵌套定義函數(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++){//在定義過(guò)程中出現(xiàn)嵌套調(diào)用

}

returnresult;}intmain(){

printf("1!+2!+...+9!+10!=%ld\n",sum(10));//在調(diào)用過(guò)程中出現(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ù)雜問(wèn)題可以很容易地使用遞歸調(diào)用方法得到解決,如:漢諾塔問(wèn)題、求階乘等。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í)例:年齡問(wèn)題(書(shū)本146頁(yè))

#include<stdio.h>

intage(intn)

{

intx;

if(n==1)

x=10;

else

x=age(n-1)+2;

returnx;

}

intmain()

{

intn;

printf("請(qǐng)輸入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)變量,它與普通變量并無(wú)區(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ù)組可以訪問(wèn)實(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)行說(shuō)明:

(1)f(intb[10]);(2)f(intb[]);(3)f(int*b)。

注意:形參數(shù)組的長(zhǎng)度可以省略。為了在被調(diào)用函數(shù)中滿足處理數(shù)組元素的需要,可另設(shè)一個(gè)參數(shù),用來(lái)傳遞數(shù)組元素的個(gè)數(shù)。當(dāng)函數(shù)參數(shù)為一維數(shù)組時(shí),形參數(shù)組無(wú)需指定大小,但數(shù)組名后面的方括號(hào)是不能被省略的。也可用多維數(shù)組名作為實(shí)參和形參,在被調(diào)用函數(shù)中對(duì)形參數(shù)組進(jìn)行定義時(shí),可以指定每一維的長(zhǎng)度,也可省略第一維的長(zhǎng)度。例如,形參數(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é)生的考試成績(jī),求平均成績(jī)。

#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è)新的概念:變量的作用域,也就是說(shuō)不同位置定義變量,其作用域不一樣,變量的作用域就是變量的有效范圍。C語(yǔ)言只允許在3個(gè)地方定義變量:

函數(shù)內(nèi)部的聲明部分。所有函數(shù)的外部。復(fù)合語(yǔ)句中的聲明部分。

變量定義的位置不同,其作用域也不同。從變量的作用域來(lái)分,可以將其分為局部變量和全局變量。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ù)合語(yǔ)句中定義變量,這個(gè)變量只在本復(fù)合語(yǔ)句中有效,如圖所示。

5.5全局變量和局部變量實(shí)例:寫(xiě)出下列程序并運(yùn)行得到結(jié)果。

#include<stdio.h>

voidmain()

{

inti,a=0;

for(i=1;i<=2;i++)

{

inta=1;a++;//在復(fù)合語(yǔ)句內(nèi)開(kāi)辟新的a

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

}//釋放復(fù)合語(yǔ)句內(nèi)開(kāi)辟的a,不能再使用它

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

}5.5全局變量和局部變量

5.5.2全局變量

全局變量是在函數(shù)外部定義的變量,也稱為外部變量。其作用范圍是從其被定義的地方開(kāi)始直至本源程序文件的結(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)行過(guò)程中始終占用存儲(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è)新的概念:變量的生命期。變量從定義開(kāi)始分配存儲(chǔ)單元,到運(yùn)行結(jié)束存儲(chǔ)單元被回收,整個(gè)過(guò)程稱為變量生命期。影響變量生命期的是變量的存儲(chǔ)類型,也就是說(shuō)變量的存儲(chǔ)類型不同,其生命期也是不同的。

5.6變量的存儲(chǔ)類別

5.6.1靜態(tài)存儲(chǔ)與動(dòng)態(tài)存儲(chǔ)

C語(yǔ)言的數(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ū)。變量的存放位置決定了變量的生命期。從變量的生命期來(lái)分,可以將變量的存儲(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)介紹過(guò)的變量的數(shù)據(jù)類型以及變量的存儲(chǔ)類型。用變量的存儲(chǔ)類型說(shuō)明來(lái)確定變量的存放位置。

帶有存儲(chǔ)類型的變量,其定義的一般形式:存儲(chǔ)類型數(shù)據(jù)類型變量名;

在C語(yǔ)言中,變量的存儲(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ù)體中說(shuō)明的變量、函數(shù)的參數(shù)、程序塊中定義的變量稱為自動(dòng)變量。其定義形式為:auto類型名變量名;自動(dòng)變量存放在動(dòng)態(tài)存儲(chǔ)區(qū),是動(dòng)態(tài)分配存儲(chǔ)空間的。C語(yǔ)言規(guī)定:在局部變量的定義中,可省略關(guān)鍵字“auto”,即沒(méi)有指明存儲(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類型。局部變量和全局變量都可以說(shuō)明為static類型。靜態(tài)局部變量的生存期與全局變量的生命期相同,作用域與局部變量的作用域相同。全局變量無(wú)論是否被說(shuō)明為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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論