版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第第6 6章章 函數(shù)函數(shù) 函數(shù)的定義函數(shù)的定義函數(shù)參數(shù)的值的傳遞函數(shù)參數(shù)的值的傳遞函數(shù)的調(diào)用函數(shù)的調(diào)用數(shù)組作為函數(shù)的參數(shù)數(shù)組作為函數(shù)的參數(shù)函數(shù)與指針函數(shù)與指針變量的作用域及存貯類型變量的作用域及存貯類型(指向函數(shù)的指針不要求?。ㄖ赶蚝瘮?shù)的指針不要求?。┍菊乱c本章要點如前所述,如前所述,C程序是由函數(shù)組成的。通過函數(shù),我們可以一程序是由函數(shù)組成的。通過函數(shù),我們可以一個較大的問題分成若干個小問題來解決,如用積木建房子。個較大的問題分成若干個小問題來解決,如用積木建房子。1 1 函數(shù)概述函數(shù)概述標(biāo)準(zhǔn)庫函數(shù):標(biāo)準(zhǔn)庫函數(shù):由系統(tǒng)提供,用戶可以不必自己去編由系統(tǒng)提供,用戶可以不必自己去編寫程序段而直
2、接調(diào)用這些函數(shù)。但必須打開相應(yīng)的寫程序段而直接調(diào)用這些函數(shù)。但必須打開相應(yīng)的頭文件。如頭文件。如printfprintf、scanfscanf等函數(shù)。等函數(shù)。用戶自定義函數(shù):用戶自定義函數(shù):為了實現(xiàn)用戶的特殊需要而自編為了實現(xiàn)用戶的特殊需要而自編的函數(shù)。如的函數(shù)。如max(int x,int y) max(int x,int y) 有參函數(shù):有參函數(shù):在調(diào)用函數(shù)時,需要進(jìn)行參數(shù)傳遞的函在調(diào)用函數(shù)時,需要進(jìn)行參數(shù)傳遞的函數(shù),如數(shù),如max(a,b);max(a,b);無參函數(shù):無參函數(shù):如如 getchar(); getchar(); 1無參函數(shù)的定義:無參函數(shù)的定義: 類型標(biāo)識符類型標(biāo)識符 函
3、數(shù)名()函數(shù)名() 聲明部分;聲明部分; /*定義變量定義變量*/ 語句;語句; /*執(zhí)行部分執(zhí)行部分*/ 2有參函數(shù)的定義:有參函數(shù)的定義: 類型標(biāo)識符類型標(biāo)識符 函數(shù)名(形式參數(shù)說明表列)函數(shù)名(形式參數(shù)說明表列) 聲明部分;聲明部分; /*定義變量定義變量*/ 語句;語句; /*執(zhí)行部分執(zhí)行部分*/ 2 2 函數(shù)定義和調(diào)用函數(shù)定義和調(diào)用函數(shù)的函數(shù)的“類型標(biāo)識符類型標(biāo)識符”用來說明函數(shù)的返回值的類型,用來說明函數(shù)的返回值的類型,通常我們稱之為通常我們稱之為函數(shù)的類型函數(shù)的類型。如果定義這個函數(shù)只是。如果定義這個函數(shù)只是為了實現(xiàn)某個操作而不需要返回值,則應(yīng)將該函數(shù)定為了實現(xiàn)某個操作而不需要返
4、回值,則應(yīng)將該函數(shù)定義為無返回值類型,即義為無返回值類型,即void類型。類型。如果你定義的函數(shù)不是如果你定義的函數(shù)不是void類型,則意味著該函數(shù)只類型,則意味著該函數(shù)只有一個值。此時,在該函數(shù)的結(jié)束處,應(yīng)使用有一個值。此時,在該函數(shù)的結(jié)束處,應(yīng)使用return語句給主調(diào)函數(shù)帶回一個值。語句給主調(diào)函數(shù)帶回一個值。當(dāng)函數(shù)執(zhí)行到當(dāng)函數(shù)執(zhí)行到return語句時,立即中止本函數(shù)的執(zhí)行,語句時,立即中止本函數(shù)的執(zhí)行,而返回到主調(diào)函數(shù)處,同時將相應(yīng)而返回到主調(diào)函數(shù)處,同時將相應(yīng)return 語句中的語句中的值帶回到主調(diào)函數(shù)。值帶回到主調(diào)函數(shù)。一個函數(shù)中可以有多個一個函數(shù)中可以有多個return語句,先執(zhí)
5、行到哪個,語句,先執(zhí)行到哪個,哪個就起作用,即執(zhí)行到哪個就起作用,即執(zhí)行到return語句時,程序?qū)⒉辉僬Z句時,程序?qū)⒉辉傧蛳聢?zhí)行,而返回到調(diào)用它的地方。向下執(zhí)行,而返回到調(diào)用它的地方。3 3 函數(shù)的返回值函數(shù)的返回值“形參形參”與與“實參實參” :在定義函數(shù)時函數(shù)名后面括號中的變量稱為“形式參數(shù)”,簡稱“形參形參”;調(diào)用函數(shù)時函數(shù)名后括號中對應(yīng)參數(shù)稱為“實際參數(shù)”,簡稱“實參實參”。如: int max( int x, int y) return (xy?x:y); 形參形參 void main( ) int a=1,b=4; c=max(a, b) 實參實參4 4 函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)
6、傳遞函數(shù)定義舉例int factor ( int n ) int s=1,k; for(k=1;k=n;k+) s=s*k; return s;“函數(shù)類型函數(shù)類型”指指函數(shù)返回值的類函數(shù)返回值的類型,型,也就是說,也就是說,當(dāng)該函數(shù)執(zhí)行完當(dāng)該函數(shù)執(zhí)行完成以后,得到一成以后,得到一個什么類型的結(jié)個什么類型的結(jié)果。果。若省略此項,則若省略此項,則認(rèn)為返回類型是認(rèn)為返回類型是intint若函數(shù)無返回值,若函數(shù)無返回值,則應(yīng)定義類型為則應(yīng)定義類型為voidvoid函數(shù)定義舉例int factor ( int n ) int s=1,k; for(k=1;k=n;k+) s=s*k; return s;
7、函數(shù)名:函數(shù)名:通常是通常是一個標(biāo)識符,在一個標(biāo)識符,在一個程序中除了一個程序中除了主函數(shù)外其余函主函數(shù)外其余函數(shù)的名字可以任數(shù)的名字可以任意取,但應(yīng)盡量意取,但應(yīng)盡量做到見名知意。做到見名知意。函數(shù)名后面的函數(shù)名后面的 “()()” 必須有,必須有,表示是函數(shù)。表示是函數(shù)。函數(shù)定義舉例int factor ( int n ) int s=1,k; for(k=1;k=n;k+) s=s*k; return s;形參表:形參表:函數(shù)定函數(shù)定義時的參數(shù)稱為義時的參數(shù)稱為形式參數(shù),形式參數(shù),形式形式參數(shù)彼此間用逗參數(shù)彼此間用逗號分隔。每個參號分隔。每個參數(shù)應(yīng)分別指明其數(shù)應(yīng)分別指明其類型。類型。沒有
8、形式參數(shù)的沒有形式參數(shù)的函數(shù)稱為無參函函數(shù)稱為無參函數(shù)。注意無參函數(shù)。注意無參函數(shù)名字后的圓括數(shù)名字后的圓括號不能省。號不能省。函數(shù)定義舉例int factor ( int n ) int s=1,k; for(k=1;k=n;k+) s=s*k; return s;函數(shù)中所需變量函數(shù)中所需變量的定義的定義注:形參及函數(shù)注:形參及函數(shù)中的變量均是在中的變量均是在函數(shù)被調(diào)用時才函數(shù)被調(diào)用時才為它們分配存儲為它們分配存儲單元,函數(shù)調(diào)用單元,函數(shù)調(diào)用結(jié)束后,其存儲結(jié)束后,其存儲單元會被系統(tǒng)收單元會被系統(tǒng)收回!回!函數(shù)定義舉例int factor ( int n ) int s=1,k; for(k=
9、1;kb) c=1; if(a = =b) c=0; if(ay?x:y; void main( ) . c=max(a,b); 3 3、在調(diào)用這個函數(shù)之前對所調(diào)用個函數(shù)作一個說明,讓、在調(diào)用這個函數(shù)之前對所調(diào)用個函數(shù)作一個說明,讓系統(tǒng)知道這個函數(shù)需要的參數(shù)、類型,以及返回值的系統(tǒng)知道這個函數(shù)需要的參數(shù)、類型,以及返回值的類型,這即是對該類型,這即是對該函數(shù)的聲明函數(shù)的聲明。但是注意,。但是注意,對函數(shù)說對函數(shù)說明時明時, ,括號后有分號;而函數(shù)定義時則沒有。括號后有分號;而函數(shù)定義時則沒有。如:如: int max(int x,int y); / - 函數(shù)的聲明函數(shù)的聲明 void main
10、( ) int max(int x,int y); / - 函數(shù)的聲明函數(shù)的聲明 c=max(a,b); 主程序中對函數(shù)的調(diào)用語句主程序中對函數(shù)的調(diào)用語句 int max(int x,int y) return xy?x:y; 函數(shù)的定義函數(shù)的定義 (2 2)、對被調(diào)用函數(shù)的聲明)、對被調(diào)用函數(shù)的聲明函數(shù)聲明可以在主調(diào)函數(shù)內(nèi),也可以在函數(shù)外。函數(shù)聲明可以在主調(diào)函數(shù)內(nèi),也可以在函數(shù)外。其區(qū)其區(qū)別在于別在于:在函數(shù)體外部進(jìn)行的聲明,在本文件中的所:在函數(shù)體外部進(jìn)行的聲明,在本文件中的所有地方都有效,無需在主調(diào)函數(shù)內(nèi)再次聲明;在函數(shù)有地方都有效,無需在主調(diào)函數(shù)內(nèi)再次聲明;在函數(shù)內(nèi)部進(jìn)行的聲明,則所聲
11、明的函數(shù)只能在本函數(shù)內(nèi)部內(nèi)部進(jìn)行的聲明,則所聲明的函數(shù)只能在本函數(shù)內(nèi)部使用;使用;所謂的函數(shù)的嵌套調(diào)用,就是在調(diào)用一個函數(shù)的過程所謂的函數(shù)的嵌套調(diào)用,就是在調(diào)用一個函數(shù)的過程中,又調(diào)用了其它函數(shù)。如在主函數(shù)中調(diào)用了中,又調(diào)用了其它函數(shù)。如在主函數(shù)中調(diào)用了a a函數(shù),函數(shù),而在而在a a函數(shù)中又調(diào)用了函數(shù)中又調(diào)用了b b函數(shù),在函數(shù),在b b函數(shù)中又調(diào)用了函數(shù)中又調(diào)用了c c函函數(shù),這就是函數(shù)的嵌套調(diào)用。其調(diào)用過程如下圖所示:數(shù),這就是函數(shù)的嵌套調(diào)用。其調(diào)用過程如下圖所示: 6 6 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用 main() a( ); a( )a( ) b( ); b( ); c( )c( )
12、 b( )b( ) c( ); c( ); main() int a=1,b; b=func1(a); printf(“%d”,b);func1(int x) int y; y=func2(x)+1; return y; 例:函數(shù)的嵌套調(diào)用例:函數(shù)的嵌套調(diào)用func2(int x) int y; y=func3(x)+1; return y; func3(int x) int y; y=x+5; return y; 輸出結(jié)果:8數(shù)組元素做函數(shù)的實參,其用法與變量相同。(每個數(shù)組元素做函數(shù)的實參,其用法與變量相同。(每個的數(shù)組元素相當(dāng)于一個獨立變量)。例如:的數(shù)組元素相當(dāng)于一個獨立變量)。例如:
13、7 7 函數(shù)與函數(shù)與數(shù)組數(shù)組數(shù)組數(shù)組作為作為函數(shù)的參數(shù),可以有兩種情況:函數(shù)的參數(shù),可以有兩種情況:例:比較兩個數(shù)組中的元素,統(tǒng)計出例:比較兩個數(shù)組中的元素,統(tǒng)計出a a中大于對應(yīng)中大于對應(yīng)b b中元素的位置。中元素的位置。int compare(int x,int y) int z; if(xy) z=1; else if(x=y) z=0; else z=-1; return z; void main( )int a10=,b10=, i , t; for(i=0;i0)printf(“a%db%d ”,i,i); 輸出:輸出: a2b2 數(shù)組名作為函數(shù)參數(shù):數(shù)組名作為函數(shù)參數(shù):前面我們已
14、經(jīng)知道:在前面我們已經(jīng)知道:在C C中,數(shù)組名代表的是數(shù)組的起中,數(shù)組名代表的是數(shù)組的起始地址。因此,始地址。因此,當(dāng)數(shù)組名作為函數(shù)的參數(shù)時,所傳遞當(dāng)數(shù)組名作為函數(shù)的參數(shù)時,所傳遞的也是數(shù)組的起始地址。的也是數(shù)組的起始地址。8 8 數(shù)組作為數(shù)組作為函數(shù)的參數(shù)函數(shù)的參數(shù)例:自編字符串復(fù)制函數(shù)例:自編字符串復(fù)制函數(shù)strcopystrcopy strcopy(char str1130,char str2230) int i; for(i=0;str22i!=0;i+) str11i=str22i; str11i=0; void main( ) char str130; char str230=”a
15、bcde”; printf(“%s”,str1); strcopy(str1,str2); printf(“%s”,str1); 思考:思考:mainmain中打印出的結(jié)果是?中打印出的結(jié)果是?Strcopy Strcopy 退出循環(huán)是時退出循環(huán)是時I I值?值?main() int i,a5=1,2,3,4,5;例例1 1:數(shù)組名作為函數(shù)參數(shù):數(shù)組名作為函數(shù)參數(shù)func( a );0 x2000a01a12a23a34a45void func(int x5)void func(int x5) x3=0; for(i=0;i5;i+) printf(“%d ”,ai); 0 x2000X3=0
16、;X3X3(0 x2000+30 x2000+3)所對應(yīng)的元素所對應(yīng)的元素0 x2000a01X0a12X1a23X2a30X3a45X4例例2 2:試比較以下程序與上面程序的區(qū)別:試比較以下程序與上面程序的區(qū)別輸出結(jié)果:1 2 3 4 5void func(int x) x=0; main() int i,a5=1,2,3,4,5; func( a3 ); for(i=0;i5;i+) printf(“%d ”,ai); a010 x2000a12a23a34a45X 4X 4X 0X 01 1、當(dāng)用數(shù)組名作為函數(shù)參數(shù)時,并不是象變量作形、當(dāng)用數(shù)組名作為函數(shù)參數(shù)時,并不是象變量作形參一樣,再
17、開空間給形參數(shù)組,而是接收數(shù)組名參一樣,再開空間給形參數(shù)組,而是接收數(shù)組名傳遞來的數(shù)組的首地址。所以,在子函數(shù)中對數(shù)傳遞來的數(shù)組的首地址。所以,在子函數(shù)中對數(shù)組的修改,實質(zhì)上就是對主函數(shù)中數(shù)組的修改。組的修改,實質(zhì)上就是對主函數(shù)中數(shù)組的修改。2 2、實參數(shù)組與形參數(shù)組類型必須一致。、實參數(shù)組與形參數(shù)組類型必須一致。 3 3、主調(diào)函數(shù)和被調(diào)函數(shù)中分別定義數(shù)組名,可以一、主調(diào)函數(shù)和被調(diào)函數(shù)中分別定義數(shù)組名,可以一樣,也可不一樣,系統(tǒng)回自動區(qū)分,互不干擾。樣,也可不一樣,系統(tǒng)回自動區(qū)分,互不干擾。 由上面兩例所得結(jié)論:由上面兩例所得結(jié)論:再看幾例:例例1 1:自編字符串復(fù)制函數(shù):自編字符串復(fù)制函數(shù)s
18、trcopystrcopy strcopy(char str130,char str230) int i; for(i=0;str2i!=0;i+) str1i=str2i; str1i=0; void main( ) char str130; char str230=”abcde”; printf(“%s”,str1); strcopy(str1,str2); printf(“%s”,str1); 再看幾例:例例2 2:自編求字符串長函數(shù):自編求字符串長函數(shù)strlenthstrlenth strlenth(char str30) int i; for(i=0;str2i!=0;i+) ;
19、return i; void main( ) char str130=”abcde”; int len; len=strlenth(str1); printf(“%d”,len); 再看幾例:例例3 3:自編字符串比較函數(shù):自編字符串比較函數(shù)strcompstrcomp int strcomp(char str1,char str2) int i; for(i=0;str1i=str2i & str1i!=0;i+) ; return (str1i-str2i); void main( ) char str130,str230; int d; gets(str1); gets(str2
20、); d=strcomp(str1,str2); printf(“%d”,d); 9 指針作為函數(shù)參數(shù)指針作為函數(shù)參數(shù)1、傳址調(diào)用傳址調(diào)用:指針變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)當(dāng)指針變量作為函數(shù)參數(shù)時當(dāng)指針變量作為函數(shù)參數(shù)時, ,傳遞的是變量的地傳遞的是變量的地址。讀以下程序:址。讀以下程序:a30 x2000:P主主&at t30 x6000:P函函&a如果將程序的第如果將程序的第4 4)行改為)行改為(* *p p)+,+,請再觀察請再觀察程序的結(jié)果:程序的結(jié)果:a30 x2000:p&at30 x6000:p&a例例1 1:兩數(shù)交換函數(shù):兩數(shù)交換函數(shù)s
21、wapswapt:a0 x2000b02002p1&ap2&bp1&ap2&b例例1 1:兩數(shù)交換函數(shù):兩數(shù)交換函數(shù)swapswapt:a30 x2000b502002p1&ap2&bp1&ap2&ba30 x2000b502002p1&ap2&bp1&ap2&bp例例2 2:兩數(shù)交換函數(shù):兩數(shù)交換函數(shù)swapswapa30 x2000b502002p1&ap2&bp1&bp2&ap例例2 2:兩數(shù)交換函數(shù):兩數(shù)交換函數(shù)swapswap例例3 3:兩數(shù)交換函數(shù):兩數(shù)交
22、換函數(shù)swapswap9 指針與函數(shù) 一維數(shù)組的指針作函數(shù)參數(shù) 例如被調(diào)函數(shù)abc的定義形式有以下三種: void abc(int b10) void abc(int b ) void abc(int *b) 在主調(diào)函數(shù)有如下定義: int a10,*p=a; 則調(diào)用abc函數(shù)時可用 abc(a) 或 abc(p)9 指針與函數(shù) 【例8.20】字符串復(fù)制函數(shù)。 void copystr(char , char ) while ( +=+)!=0); main( ) char 80,=I am a student.; copystr( , ); printf(%sn,c); 9 指針與函數(shù) 二維
23、數(shù)組的指針作函數(shù)參數(shù) 用函數(shù)輸入輸出整型二維數(shù)組,函數(shù)的形參為行指針行指針。 void inarr(int (*p1)4,int m) int i,j; /* 可改寫為void inarr(int p1 4,int m) */ for (i=0; im; i+) for (j=0; j4; j+) scanf(%d,*(p1+i)+j); 9 指針與函數(shù) 二維數(shù)組的指針作函數(shù)參數(shù) 指向二維數(shù)組元素的指針作函數(shù)參數(shù)【例】用函數(shù)輸入輸出整型二維數(shù)組,函數(shù)的形參為指向二維 數(shù)組元素的指針元素的指針。 void inarr( int *p1, int m,int n) int i,j; for (i=
24、0; im; i+) for (j=0; j 0用遞歸求解更簡單用遞歸求解更簡單Main()long n;Scanf(“%ld”,&n);Printf(“%ld”,fact(n); 遞歸過程遞歸過程1 1. .遞歸過程的特點:遞歸過程的特點:是程序設(shè)計的一個強有力的工具,它具有是程序設(shè)計的一個強有力的工具,它具有結(jié)構(gòu)清晰,程序易編、易讀、易調(diào)試,程序正確性易證明等結(jié)構(gòu)清晰,程序易編、易讀、易調(diào)試,程序正確性易證明等優(yōu)點;但運行效率低。優(yōu)點;但運行效率低。 2 2. .基本原理:基本原理:基本原理是重復(fù)地把問題轉(zhuǎn)化為與原問題相似的基本原理是重復(fù)地把問題轉(zhuǎn)化為與原問題相似的新問題,新問題,
25、 直到問題可解決為止。直到問題可解決為止。3 3. .關(guān)鍵點關(guān)鍵點: 用較用較簡單簡單的新問題來表示的新問題來表示較復(fù)雜較復(fù)雜的原問題的原問題 例如例如 : n n!= = n(n-1)n(n-1)!,!,或或 n! = (n+1)n! = (n+1)!/(n+1) /(n+1) 前 者前 者 ( ( n - 1 )n - 1 ) ! 較 原 問 題較 原 問 題 n n ! 簡 單 , 可 行 ;簡 單 , 可 行 ; 而后者而后者( (n+1)n+1)!較較n n!更復(fù)雜,不可行。更復(fù)雜,不可行。 不能產(chǎn)生自己調(diào)用自己的無窮序列,即必須有一個遞歸調(diào)不能產(chǎn)生自己調(diào)用自己的無窮序列,即必須有一
26、個遞歸調(diào)用序列的用序列的“出口出口”,來終止遞歸調(diào)用。,來終止遞歸調(diào)用。遞歸函數(shù):Fun(n)if(n0) fun(n/2);Printf(“%d ”,n); Main() int a=6; fun(a); 請問該程序輸出結(jié)果是:#include #include void main()int i; char *day_name(int n);printf(“input Day No:n”);scanf(“%d”,&i);printf(“Day No:%2d %s n”,i, day_name(i) );char *day_name(int n)static char *name8 =
27、“error”,”Monday”,”Tuesday”,; return(n7)?name0,namen);變量的作用域變量的作用域:使用變量都必須先定義。但并非定義之后,在程使用變量都必須先定義。但并非定義之后,在程序的任何地方均可使用這一變量。變量是有一定序的任何地方均可使用這一變量。變量是有一定的作用范圍的。根據(jù)變量的作用范圍,可將變量的作用范圍的。根據(jù)變量的作用范圍,可將變量分為分為局部變量(內(nèi)部變量)局部變量(內(nèi)部變量)和和全局變量(外部變?nèi)肿兞浚ㄍ獠孔兞浚┝浚?。局部變量:局部變量:作用范圍局限與某個函數(shù)或結(jié)構(gòu)體復(fù)作用范圍局限與某個函數(shù)或結(jié)構(gòu)體復(fù)合語句內(nèi)。合語句內(nèi)。全局變量:全局變量
28、:在函數(shù)體外定義的變量是全局變量。在函數(shù)體外定義的變量是全局變量。其作用范圍為定義之處開始,至整個程序結(jié)束。其作用范圍為定義之處開始,至整個程序結(jié)束。 12 12 變量的存儲類型變量的存儲類型int max( int x , int y) int a; if(xy) return x; else return y; void main( ) int a=3,b=5,c; c=max(a,b); 局部變量例:局部變量例: x,y的作用范圍的作用范圍 a的作用范圍的作用范圍不同函數(shù)中可以不同函數(shù)中可以定義同名變量,定義同名變量,互不干擾互不干擾 a,b,c的作用范圍的作用范圍 主函數(shù)中定義的量主函
29、數(shù)中定義的量也屬局部變量也屬局部變量如果變量的定義是如果變量的定義是放在某放在某復(fù)合語句中復(fù)合語句中的,那么,該變量的,那么,該變量的作用范圍就只在的作用范圍就只在這個復(fù)合語句中有這個復(fù)合語句中有效。效。int max( int x , int y) c=x-y; return c; void main( ) int a=3,b=5,c; c=max(a,b); 局部變量例:局部變量例: x,y的作用范圍的作用范圍 語法錯誤,語法錯誤,不能識別的不能識別的標(biāo)識符標(biāo)識符C a,b,c的作用范圍的作用范圍 主函數(shù)中定義的量也屬局部變量主函數(shù)中定義的量也屬局部變量 int a,b; void fun
30、c(int x,int y) a=x+5; b=y+3; void main() func(3,8); printf(“a=%d,b=%dn”,a,b); func(4,6); printf(“a=%d,b=%dn”,a,b); func(a,b); printf(“a=%d,b=%dn”,a,b); 全局變量例:全局變量例: a,b的作用范圍的作用范圍 x,y的作用范圍的作用范圍 int a,b; void func(int x,int y) int b; a=x+5; b=y+3; void main() func(3,8); printf(“a=%d,b=%dn”,a,b); func(
31、4,6); printf(“a=%d,b=%dn”,a,b); func(a,b); printf(“a=%d,b=%dn”,a,b); 全局變量例:全局變量例: a,b的作用范圍的作用范圍 x,y的作用范圍,的作用范圍,全局變量全局變量b被屏蔽,被屏蔽,局部變量局部變量b起作用起作用全局變量全局變量在所有函數(shù)之外定義的變量在所有函數(shù)之外定義的變量在程序中定義它的位置以后都有效在程序中定義它的位置以后都有效自動初始化為自動初始化為0從程序運行起即占據(jù)內(nèi)存,程序運行過程中可隨時訪問,程序退從程序運行起即占據(jù)內(nèi)存,程序運行過程中可隨時訪問,程序退出時釋放內(nèi)存出時釋放內(nèi)存 在定義點之前或在其他文件中
32、引用,應(yīng)該進(jìn)行如下聲明:在定義點之前或在其他文件中引用,應(yīng)該進(jìn)行如下聲明: extern 類型名類型名 變量名變量名;使函數(shù)之間的數(shù)據(jù)交換更容易,也更高效使函數(shù)之間的數(shù)據(jù)交換更容易,也更高效但是并不推薦使用但是并不推薦使用因為誰都可以改寫全局變量,所以很難確定是誰改寫了它因為誰都可以改寫全局變量,所以很難確定是誰改寫了它結(jié)論:結(jié)論:盡可能不使用全局變量!盡可能不使用全局變量!全局變量與局部變量同名屏蔽原則:局部優(yōu)先全局變量與局部變量同名屏蔽原則:局部優(yōu)先局部變量的全局變量比較:局部變量的全局變量比較:根據(jù)變量的存在的時間(生存期),變量可劃根據(jù)變量的存在的時間(生存期),變量可劃分為:分為:動
33、態(tài)存儲變量動態(tài)存儲變量和和靜態(tài)存儲變量靜態(tài)存儲變量。動態(tài)存儲方式:動態(tài)存儲方式:是在程序運行期間根據(jù)需要進(jìn)是在程序運行期間根據(jù)需要進(jìn)行動態(tài)分配存儲空間的方式。與之對應(yīng)的變量行動態(tài)分配存儲空間的方式。與之對應(yīng)的變量被稱為被稱為動態(tài)存儲變量。動態(tài)存儲變量。通常,如果定義的變量通常,如果定義的變量沒有其它的說明的話,系統(tǒng)自動將之作為一個沒有其它的說明的話,系統(tǒng)自動將之作為一個動態(tài)存儲變量,簡稱動態(tài)存儲變量,簡稱動態(tài)變量動態(tài)變量。當(dāng)然,也可用。當(dāng)然,也可用關(guān)健字關(guān)健字“autoauto”進(jìn)行定義。進(jìn)行定義。靜態(tài)存儲方式:靜態(tài)存儲方式:是指程序在運行期間分配給固是指程序在運行期間分配給固定存儲空間的方式
34、。與之對應(yīng)的變量被稱為定存儲空間的方式。與之對應(yīng)的變量被稱為靜靜態(tài)存儲變量,態(tài)存儲變量,簡稱簡稱靜態(tài)變量。靜態(tài)變量。必須用關(guān)健字必須用關(guān)健字“staticstatic”進(jìn)行定義。進(jìn)行定義。 1313 動態(tài)存儲變量與靜態(tài)存儲變量動態(tài)存儲變量與靜態(tài)存儲變量 13 動態(tài)存儲變量與靜態(tài)存儲變量動態(tài)存儲變量與靜態(tài)存儲變量 指數(shù)據(jù)在內(nèi)存中存儲的方式,即編譯器為變量分配內(nèi)存的方式,它決定變量的生存期動態(tài)存儲根據(jù)需要臨時分配存儲空間,離開即釋放靜態(tài)存儲在程序運行期間分配固定的存儲空間不釋放程序區(qū)程序區(qū)靜態(tài)存儲區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)動態(tài)存儲區(qū)形參、自動變形參、自動變量、函數(shù)調(diào)用量、函數(shù)調(diào)用的現(xiàn)場等的現(xiàn)場等全局變
35、量、全局變量、靜態(tài)變量靜態(tài)變量自動變量 (auto )“自動”體現(xiàn)在進(jìn)入語句塊時自動申請內(nèi)存,退出時自動釋放內(nèi)存 動態(tài)局部變量標(biāo)準(zhǔn)定義格式auto 類型名類型名 變量名變量名;缺省的存儲類型不初始化時,值是不確定的不初始化時,值是不確定的 add(a,b);add(a,b);printf(“%d,%d”,a,b);Add(a,b);printf(“%d,%d”,a,b);void add (int x,int y) void add (int x,int y) 3535void main( )void main( ) int a=3,b=5; int a=3,b=5;x=x+10;y=y+10
36、; add(a,b);add(a,b);void add (int x,int y) void add (int x,int y) 35void main( )void main( ) int a=3,b=5; int a=3,b=5;x=x+10; y=y+10; 1315 add(a,b);add(a,b);35void main( )void main( ) int a=3,b=5; int a=3,b=5;printf(printf(“%d,%d%d,%d”,a,b);,a,b); add(a,b);add(a,b);printf(“%d,%d”,a,b);Add(a,b);print
37、f(“%d,%d”,a,b);void add (int x,int y) void add (int x,int y) 3535void main( )void main( ) int a=3,b=5; int a=3,b=5;x=x+10;y=y+10;void add (int x,int y) void add (int x,int y) 35void main( )void main( ) int a=3,b=5; int a=3,b=5;x=x+10; y=y+10; 1315 add(a,b);add(a,b);printf(“%d,%d”,a,b);Add(a,b);print
38、f(“%d,%d”,a,b);35void main( )void main( ) int a=3,b=5; int a=3,b=5; add(a,b);add(a,b);printf(“%d,%d”,a,b);Add(a,b);printf(“%d,%d”,a,b);靜態(tài)變量(static)一個函數(shù)的內(nèi)部變量在函數(shù)退出后失效。再次進(jìn)入函數(shù),變量值重新初始化把此變量定義為static,則變量的值可以保存到下次進(jìn)入函數(shù)static int i;靜態(tài)變量和全局變量都是靜態(tài)存儲類型自動初始化為自動初始化為0從靜態(tài)存儲區(qū)分配,生存期為整個程序運行期間從靜態(tài)存儲區(qū)分配,生存期為整個程序運行期間但作用域不
39、同但作用域不同對于用對于用“staticstatic”關(guān)健字定義的靜態(tài)變量則不同:該類關(guān)健字定義的靜態(tài)變量則不同:該類型的變量由系統(tǒng)分配一個專門的存儲空間來存放;當(dāng)型的變量由系統(tǒng)分配一個專門的存儲空間來存放;當(dāng)函數(shù)調(diào)用結(jié)束后,該變量所占空間并不釋放,當(dāng)下次函數(shù)調(diào)用結(jié)束后,該變量所占空間并不釋放,當(dāng)下次再調(diào)用該函數(shù)時,該變量中已有值。如下例所示:再調(diào)用該函數(shù)時,該變量中已有值。如下例所示:1313 動態(tài)存儲變量與靜態(tài)存儲變量動態(tài)存儲變量與靜態(tài)存儲變量 int f(int a) int b=0; static int c=3; b=b+1; c=c+1; return(a+b+c);); void
40、 main()() int a=2,b,i; b=f(a); printf(“%dn”,b); b=f(a); printf(“%dn”,b); b=f(a);b=f(a);2?2void main( )void main( ) int a=2,b; int a=2,b;int b=0;b=b+1;static int c=3;01313 動態(tài)存儲變量與靜態(tài)存儲變量動態(tài)存儲變量與靜態(tài)存儲變量 3int f ( int a ) b=f(a);b=f(a);2?void main( )void main( ) int a=2,b; int a=2,b;int b=0;b=b+1;static in
41、t c=3;c=c+1;11313 動態(tài)存儲變量與靜態(tài)存儲變量動態(tài)存儲變量與靜態(tài)存儲變量 32int f ( int a ) b=f(a);b=f(a);2?void main( )void main( ) int a=2,b; int a=2,b;int b=0;b=b+1;static int c=3;c=c+1;return (a+b+c);11313 動態(tài)存儲變量與靜態(tài)存儲變量動態(tài)存儲變量與靜態(tài)存儲變量 42int f ( int a ) b=f(a); b=f(a);27void main( )void main( ) int a=2,b; int a=2,b;1313 動態(tài)存儲變量
42、與靜態(tài)存儲變量動態(tài)存儲變量與靜態(tài)存儲變量 4printf(printf(“b=%dnb=%dn”,b);,b);輸出:輸出:b=7b=7 b=f(a); b=f(a);int f ( int a ) 2int b=0;0static int c=3;b=b+1; b=f(a);b=f(a);27void main( )void main( ) int a=2,b; int a=2,b;int b=0;b=b+1;static int c=3;c=c+1;11313 動態(tài)存儲變量與靜態(tài)存儲變量動態(tài)存儲變量與靜態(tài)存儲變量 42int f ( int a ) printf(printf(“b=%dnb=%dn”,b);,b); b=f(a); b=f(a); b=f(a); b=f(a);27void main( )void main( ) int a=2,b; int a=2,b;int b=0;b=b+1;static int c=0;c=c+1;return (a+b+c);11313 動態(tài)存儲變量與靜態(tài)存儲變量動態(tài)存儲變量與靜態(tài)存儲變量 52int f ( int a ) printf(printf(
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生態(tài)旅游度假區(qū)招投標(biāo)申請表
- 社會保險管理與城市規(guī)劃
- 石油化工設(shè)備使用與管理
- 水上樂園水電布線施工合同
- 農(nóng)村燃?xì)鈧€人承包施工合同
- 2024年跨國醫(yī)療設(shè)備采購與技術(shù)支持合同
- 2024年河南漯河事業(yè)單位選拔100位人才3篇
- 2024年鏟車安全巡查記錄表3篇
- 2025年度跨境電商擔(dān)保抵押合同范本2篇
- 2025版物流園區(qū)土地及建筑物租賃承包協(xié)議3篇
- 2022年新媒體編輯實戰(zhàn)教程測試題及答案(題庫)
- 崗位現(xiàn)場應(yīng)急處置方案卡全套(全套20頁)
- 涼席竹片銑槽機(課程設(shè)計)
- 風(fēng)冷螺桿熱泵機組招標(biāo)技術(shù)要求
- 火力發(fā)電廠典型事故案例匯編
- (完整版)弱電工程安全技術(shù)交底
- 盤點票表格模板
- 報價單模板 Microsoft Excel 工作表
- 國家住宅裝飾裝修工程施工規(guī)范標(biāo)準(zhǔn)
- 定額管件接頭含量表
- 綜合機械化固體充填采煤技術(shù)要求-編制說明
評論
0/150
提交評論