C語(yǔ)言程序設(shè)計(jì)教程電子教案_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程電子教案_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程電子教案_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程電子教案_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程電子教案_第5頁(yè)
已閱讀5頁(yè),還剩46頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第7章 函 數(shù)c語(yǔ)言是通過(guò)函數(shù)來(lái)實(shí)現(xiàn)模塊化程序設(shè)計(jì)的。所以較大的c語(yǔ)言應(yīng)用程序,往往是由多個(gè)函數(shù)組成的,每個(gè)函數(shù)分別對(duì)應(yīng)各自的功能模塊。7.1 函數(shù)的定義與調(diào)用函數(shù)的定義與調(diào)用7.2 函數(shù)的嵌套調(diào)用與遞歸調(diào)用函數(shù)的嵌套調(diào)用與遞歸調(diào)用7.3 數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)7.4 內(nèi)部變量與外部變量?jī)?nèi)部變量與外部變量7.5 內(nèi)部函數(shù)與外部函數(shù)內(nèi)部函數(shù)與外部函數(shù)7.6 變量的動(dòng)態(tài)存儲(chǔ)與靜態(tài)存儲(chǔ)變量的動(dòng)態(tài)存儲(chǔ)與靜態(tài)存儲(chǔ) return7.1 函數(shù)的定義與調(diào)用函數(shù)的定義與調(diào)用7.1.1 7.1.1 函數(shù)的定義函數(shù)的定義7.1.2 7.1.2 函數(shù)的返回值與函數(shù)類(lèi)型函數(shù)的返回值與函數(shù)類(lèi)型7.1.3 7.1

2、.3 對(duì)被調(diào)用函數(shù)的說(shuō)明和函數(shù)原型對(duì)被調(diào)用函數(shù)的說(shuō)明和函數(shù)原型7.1.4 7.1.4 函數(shù)的調(diào)用函數(shù)的調(diào)用7.1.5 7.1.5 函數(shù)的形參與實(shí)參函數(shù)的形參與實(shí)參 return7.1 .1 函數(shù)的定義函數(shù)的定義1任何函數(shù)(包括主函數(shù)main())都是由函數(shù)說(shuō)明和函數(shù)體兩部分組成。根據(jù)函數(shù)是否需要參數(shù),可將函數(shù)分為無(wú)參函數(shù)和有參函數(shù)兩種。(1)無(wú)參函數(shù)的一般形式)無(wú)參函數(shù)的一般形式 函數(shù)類(lèi)型 函數(shù)名( void ) 說(shuō)明語(yǔ)句部分; 可執(zhí)行語(yǔ)句部分; 注意注意:在舊標(biāo)準(zhǔn)中,函數(shù)可以缺省參數(shù)表。但在新標(biāo)準(zhǔn)中,函數(shù)不可缺省參數(shù)表;如果不需要參數(shù),則用“void”表示,主函數(shù)main()例外。(2)有參

3、函數(shù)的一般形式)有參函數(shù)的一般形式函數(shù)類(lèi)型 函數(shù)名( 數(shù)據(jù)類(lèi)型 參數(shù),數(shù)據(jù)類(lèi)型 參數(shù)2 ) 說(shuō)明語(yǔ)句部分; 可執(zhí)行語(yǔ)句部分; 有參函數(shù)比無(wú)參函數(shù)多了一個(gè)參數(shù)表。調(diào)用有參函數(shù)時(shí),調(diào)用函數(shù)將賦予這些參數(shù)實(shí)際的值。為了與調(diào)用函數(shù)提供的實(shí)際參數(shù)區(qū)別開(kāi),將函數(shù)定義中的參數(shù)表稱(chēng)為形式參數(shù)表,簡(jiǎn)稱(chēng)形參表。案例7.1 定義一個(gè)函數(shù),用于求兩個(gè)數(shù)中的大數(shù)。/*案例代碼文件名:al7_1.c*/*功能:定義一個(gè)求較大數(shù)的函數(shù)并在主函數(shù)中調(diào)用*/int max(int n1, int n2) /*定義一個(gè)函數(shù)max()*/ return (n1n2?n1:n2); main() int max(int n1, in

4、t n2);/*函數(shù)說(shuō)明*/ int num1,num2; printf(input two numbers:n); scanf(%d%d, &num1, &num2);printf(max=%dn, max(num1,num2);getch();/*使程序暫停,按任一鍵繼續(xù)*/ 程序演示2說(shuō)明說(shuō)明(1)函數(shù)定義不允許嵌套函數(shù)定義不允許嵌套。在語(yǔ)言中,所有函數(shù)(包括主函數(shù)main())都是平行的。一個(gè)函數(shù)的定義,可以放在程序中的任意位置,主函數(shù)main()之前或之后。但在一個(gè)函數(shù)的函數(shù)體內(nèi),不能再定義另一個(gè)函數(shù),即不能嵌套定義。(2)空函數(shù)既無(wú)參數(shù)、函數(shù)體又為空的函數(shù)。其一般形式為:函數(shù)類(lèi)型

5、函數(shù)名(void) (3)在老版本c語(yǔ)言中,參數(shù)類(lèi)型說(shuō)明允許放在函數(shù)說(shuō)明部分的第2行單獨(dú)指定。 return7.1.2 函數(shù)的返回值與函數(shù)類(lèi)型函數(shù)的返回值與函數(shù)類(lèi)型語(yǔ)言的函數(shù)兼有其它語(yǔ)言中的函數(shù)和過(guò)程兩種功能,從這個(gè)角度看,又可把函數(shù)分為有返回值函數(shù)和無(wú)返回值函數(shù)兩種。1函數(shù)返回值與return語(yǔ)句有參函數(shù)的返回值,是通過(guò)函數(shù)中的return語(yǔ)句來(lái)獲得的。(1)return語(yǔ)句的一般格式: return ( 返回值表達(dá)式 );(2)return語(yǔ)句的功能:返回調(diào)用函數(shù),并將“返回值表達(dá)式”的值帶給調(diào)用函數(shù)。注意注意:調(diào)用函數(shù)中無(wú)return語(yǔ)句,并不是不返回一個(gè)值,而是一個(gè)不確定的值。為了明確

6、表示不返回值,可以用“void”定義成“無(wú)(空)類(lèi)型”。2函數(shù)類(lèi)型函數(shù)類(lèi)型在定義函數(shù)時(shí),對(duì)函數(shù)類(lèi)型的說(shuō)明,應(yīng)與return語(yǔ)句中、返回值表達(dá)式的類(lèi)型一致。如果不一致,則以函數(shù)類(lèi)型為準(zhǔn)。如果缺省函數(shù)類(lèi)型,則系統(tǒng)一律按整型處理。良好的程序設(shè)計(jì)習(xí)慣良好的程序設(shè)計(jì)習(xí)慣:為了使程序具有良好的可讀性并減少出錯(cuò),凡不要求返回值的函數(shù)都應(yīng)定義為空類(lèi)型;即使函數(shù)類(lèi)型為整型,也不使用系統(tǒng)的缺省處理。return7.1.3 對(duì)被調(diào)用函數(shù)的說(shuō)明和函數(shù)原型對(duì)被調(diào)用函數(shù)的說(shuō)明和函數(shù)原型 在ansi c新標(biāo)準(zhǔn)中,采用函數(shù)原型方式,對(duì)被調(diào)用函數(shù)進(jìn)行說(shuō)明,其一般格式如下:函數(shù)類(lèi)型函數(shù)類(lèi)型 函數(shù)名函數(shù)名(數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型 參數(shù)名

7、參數(shù)名, 數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型 參數(shù)名參數(shù)名2); 語(yǔ)言同時(shí)又規(guī)定,在以下2種情況下,可以省去對(duì)被調(diào)用函數(shù)的說(shuō)明: (1)當(dāng)被調(diào)用函數(shù)的函數(shù)定義出現(xiàn)在調(diào)用函數(shù)之前時(shí)。因?yàn)樵谡{(diào)用之前,編譯系統(tǒng)已經(jīng)知道了被調(diào)用函數(shù)的函數(shù)類(lèi)型、參數(shù)個(gè)數(shù)、類(lèi)型和順序。 (2)如果在所有函數(shù)定義之前,在函數(shù)外部(例如文件開(kāi)始處)預(yù)先對(duì)各個(gè)函數(shù)進(jìn)行了說(shuō)明,則在調(diào)用函數(shù)中可缺省對(duì)被調(diào)用函數(shù)的說(shuō)明。return7.1.4 函數(shù)的調(diào)用函數(shù)的調(diào)用 在程序中,是通過(guò)對(duì)函數(shù)的調(diào)用來(lái)執(zhí)行函數(shù)體的,其過(guò)程與其它語(yǔ)言的子程序調(diào)用相似。語(yǔ)言中,函數(shù)調(diào)用的一般形式為: 函數(shù)名函數(shù)名(實(shí)際參數(shù)表實(shí)際參數(shù)表) 切記切記:實(shí)參的個(gè)數(shù)、類(lèi)型和順序,應(yīng)該與

8、被調(diào)用函數(shù)所要求的參數(shù)個(gè)數(shù)、類(lèi)型和順序一致,才能正確地進(jìn)行數(shù)據(jù)傳遞。在語(yǔ)言中,可以用以下幾種方式調(diào)用函數(shù):(1)函數(shù)表達(dá)式函數(shù)表達(dá)式。函數(shù)作為表達(dá)式的一項(xiàng),出現(xiàn)在表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)算。這種方式要求函數(shù)是有返回值的。(2)函數(shù)語(yǔ)句)函數(shù)語(yǔ)句。c語(yǔ)言中的函數(shù)可以只進(jìn)行某些操作而不返回函數(shù)值,這時(shí)的函數(shù)調(diào)用可作為一條獨(dú)立的語(yǔ)句。(3)函數(shù)實(shí)參函數(shù)實(shí)參。函數(shù)作為另一個(gè)函數(shù)調(diào)用的實(shí)際參數(shù)出現(xiàn)。這種情況是把該函數(shù)的返回值作為實(shí)參進(jìn)行傳送,因此要求該函數(shù)必須是有返回值的。說(shuō)明說(shuō)明:(1)調(diào)用函數(shù)時(shí),函數(shù)名稱(chēng)必須與具有該功能的自定義函數(shù)名稱(chēng)完全一致。(2)實(shí)參在類(lèi)型上按順序與形參,必須一一對(duì)

9、應(yīng)和匹配。如果類(lèi)型不匹配,c編譯程序?qū)促x值兼容的規(guī)則進(jìn)行轉(zhuǎn)換。如果實(shí)參和形參的類(lèi)型不賦值兼容,通常并不給出出錯(cuò)信息,且程序仍然繼續(xù)執(zhí)行,只是得不到正確的結(jié)果。(3)如果實(shí)參表中包括多個(gè)參數(shù),對(duì)實(shí)參的求值順序隨系統(tǒng)而異。有的系統(tǒng)按自左向右順序求實(shí)參的值,有的系統(tǒng)則相反。turbo c和ms c是按自右向左的順序進(jìn)行的 。return7.1.5 函數(shù)的形參與實(shí)參函數(shù)的形參與實(shí)參函數(shù)的參數(shù)分為形參形參和實(shí)參實(shí)參兩種,作用是實(shí)現(xiàn)數(shù)據(jù)傳送。形參出現(xiàn)在函數(shù)定義中,只能在該函數(shù)體內(nèi)使用。發(fā)生函數(shù)調(diào)用時(shí),調(diào)用函數(shù)把實(shí)參的值復(fù)制1份,傳送給被調(diào)用函數(shù)的形參,從而實(shí)現(xiàn)調(diào)用函數(shù)向被調(diào)用函數(shù)的數(shù)據(jù)傳送。 案例案例7

10、.3 實(shí)參對(duì)形參的數(shù)據(jù)傳遞。/*實(shí)參對(duì)形參的數(shù)據(jù)傳遞。*/*案例代碼文件名:al7_3.c*/void main() void s(int n); /*說(shuō)明函數(shù)*/ int n=100; /*定義實(shí)參n,并初始化*/ s(n); /*調(diào)用函數(shù)*/ printf(n_s=%dn,n); /*輸出調(diào)用后實(shí)參的值,便于進(jìn)行比較*/ getch(); /* */void s(int n) int i; printf(n_x=%dn,n); /*輸出改變前形參的值*/ for(i=n-1; i=1; i-) n=n+i; /*改變形參的值*/ printf(n_x=%dn,n); /*輸出改變后形參的值

11、*/ 程序演示說(shuō)明:(1)實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等。無(wú)論實(shí)參是何種類(lèi)型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須具有確定的值,以便把這些值傳送給形參。因此,應(yīng)預(yù)先用賦值、輸入等辦法,使實(shí)參獲得確定的值。(2)形參變量只有在被調(diào)用時(shí),才分配內(nèi)存單元;調(diào)用結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元。因此,形參只有在該函數(shù)內(nèi)有效。調(diào)用結(jié)束,返回調(diào)用函數(shù)后,則不能再使用該形參變量。(3)實(shí)參對(duì)形參的數(shù)據(jù)傳送是單向的,即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。(4)實(shí)參和形參占用不同的內(nèi)存單元,即使同名也互不影響。return7.2 函數(shù)的嵌套調(diào)用和遞歸調(diào)用7.2.1 函數(shù)的嵌套調(diào)用函數(shù)的

12、嵌套調(diào)用 函數(shù)的嵌套調(diào)用是指,在執(zhí)行被調(diào)用函數(shù)時(shí),被調(diào)用函數(shù)又調(diào)用了其它函數(shù)。這與其它語(yǔ)言的子程序嵌套調(diào)用的情形是類(lèi)似的,其關(guān)系可表示如圖7-1。案例7.4 計(jì)算s=1k+2k+3k+n k /*案例代碼文件名:al7_4.c*/*功能:函數(shù)的嵌套調(diào)用*/#define k 4#define n 5long f1(int n,int k)/*計(jì)算n的k次方*/ long power=n; int i; for(i=1;ik;i+) power *= n; return power; long f2(int n,int k)/*計(jì)算1到n的k次方之累加和*/ long sum=0; int i;

13、 for(i=1;i1) f=power(n-1)*n; else f=1; return(f); main() int n; long y; printf(input a inteager number:n); scanf(%d,&n); y=power(n); printf(%d!=%ldn,n,y); getch(); 程序演示 return main() power() power() power()power(3)n=33*power(2)return 6n=22*power(1)return 2n=1return 17.3 數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù)數(shù)組用作函數(shù)參數(shù)有兩種形式

14、:一種是把數(shù)組元素(又稱(chēng)下標(biāo)變量)作為實(shí)參使用;另一種是把數(shù)組名作為函數(shù)的形參和實(shí)參使用。 7.3.1 數(shù)組元素作為函數(shù)參數(shù)數(shù)組元素作為函數(shù)參數(shù) 7.3.2 數(shù)組名作為函數(shù)的形參和實(shí)參數(shù)組名作為函數(shù)的形參和實(shí)參 return7.3.1 數(shù)組元素作為函數(shù)參數(shù)數(shù)組元素作為函數(shù)參數(shù) 數(shù)組元素就是下標(biāo)變量,它與普通變量并無(wú)區(qū)別。數(shù)組元素只能用作函數(shù)實(shí)參,其用法與普通變量完全相同:在發(fā)生函數(shù)調(diào)用時(shí),把數(shù)組元素的值傳送給形參,實(shí)現(xiàn)單向值傳送。案例7.6 寫(xiě)一函數(shù),統(tǒng)計(jì)字符串中字母的個(gè)數(shù)。/*案例代碼文件名:al7_6.c*/*功能:數(shù)組元素作為函數(shù)實(shí)參*/int isalp(char c) if (c=a

15、&c=a&c=z) return(1); else return(0); main() int i,num=0; char str255; printf(input a string: ); gets(str); for(i=0;stri!=0;i+) if (isalp(stri) num+; puts(str); printf(num=%dn,num); getch(); 程序演示說(shuō)明:(1)用數(shù)組元素作實(shí)參時(shí),只要數(shù)組類(lèi)型和函數(shù)的形參類(lèi)型一致即可,并不要求函數(shù)的形參也是下標(biāo)變量。換句話(huà)說(shuō),對(duì)數(shù)組元素的處理是按普通變量對(duì)待的。(2)在普通變量或下標(biāo)變量作函數(shù)參數(shù)時(shí),形參變量和實(shí)參變量是由編

16、譯系統(tǒng)分配的兩個(gè)不同的內(nèi)存單元。在函數(shù)調(diào)用時(shí)發(fā)生的值傳送,是把實(shí)參變量的值賦予形參變量。return7.3.2 數(shù)組名作為函數(shù)的形參和實(shí)參數(shù)組名作為函數(shù)的形參和實(shí)參數(shù)組名作函數(shù)參數(shù)時(shí),既可以作形參,也可以作實(shí)參。數(shù)組名作函數(shù)參數(shù)時(shí),要求形參和相對(duì)應(yīng)的實(shí)參都必須是類(lèi)型相同的數(shù)組(或指向數(shù)組的指針變量),都必須有明確的數(shù)組說(shuō)明案例案例7.7 已知某個(gè)學(xué)生5門(mén)課程的成績(jī),求平均成績(jī)。/*案例代碼文件名:al7_7.c*/float aver(float a ) /*求平均值函數(shù)*/ int i; float av,s=a0; for(i=1;i5;i+) s += ai; av=s/5; retur

17、n av; void main() float sco5,av; int i; printf(ninput 5 scores:n); for(i=0;i5;i+) scanf(%f,&scoi); av=aver(sco); /*調(diào)用函數(shù),實(shí)參為一數(shù)組名*/ printf(average score is %5.2fn,av); getch(); 程序演示說(shuō)明說(shuō)明:(1)用數(shù)組名作函數(shù)參數(shù),應(yīng)該在調(diào)用函數(shù)和被調(diào)用函數(shù)中分別定義數(shù)組,且數(shù)據(jù)類(lèi)型必須一致,否則結(jié)果將出錯(cuò)。例如,在本案例中,形參數(shù)組為a,實(shí)參數(shù)組為sco,它們的數(shù)據(jù)類(lèi)型相同。(2)c編譯系統(tǒng)對(duì)形參數(shù)組大小不作檢查,所以形參數(shù)組可以不

18、指定大小。例如,本案例中的形參數(shù)組a。 如果指定形參數(shù)組的大小,則實(shí)參數(shù)組的大小必須大于等于形參數(shù)組,否則因形參數(shù)組的部分元素沒(méi)有確定值而導(dǎo)致計(jì)算結(jié)果錯(cuò)誤。return7.4 內(nèi)部變量與外部變量?jī)?nèi)部變量與外部變量 語(yǔ)言中所有的變量都有自己的作用域。變量說(shuō)明的位置不同,其作用域也不同,據(jù)此將語(yǔ)言中的變量分為內(nèi)部變量和外部變量。7.4.1 內(nèi)部變量7.4.2 外部變量return7.4.1 內(nèi)部變量?jī)?nèi)部變量在一個(gè)函數(shù)內(nèi)部說(shuō)明的變量是內(nèi)部變量,它只在該函數(shù)范圍內(nèi)有效。也就是說(shuō),只有在包含變量說(shuō)明的函數(shù)內(nèi)部,才能使用被說(shuō)明的變量,在此函數(shù)之外就不能使用這些變量了。所以?xún)?nèi)部變量也稱(chēng)“局部變量”。例如:i

19、nt 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í)參變量,

20、則是調(diào)用函數(shù)的內(nèi)部變量。3允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對(duì)象,分配不同的單元,互不干擾,也不會(huì)發(fā)生混淆。4在復(fù)合語(yǔ)句中也可定義變量,其作用域只在復(fù)合語(yǔ)句范圍內(nèi)。 return7.4.2 外部變量外部變量在函數(shù)外部定義的變量稱(chēng)為外部變量。以此類(lèi)推,在函數(shù)外部定義的數(shù)組就稱(chēng)為外部數(shù)組。外部變量不屬于任何一個(gè)函數(shù),其作用域作用域是:從外部變量的定義位置開(kāi)始,到本文件結(jié)束為止。外部變量可被作用域內(nèi)的所有函數(shù)直接引用,所以外部變量又稱(chēng)全局變量。 案例案例7.9 輸入長(zhǎng)方體的長(zhǎng)(l)、寬(w)、高(h),求長(zhǎng)方體體積及正、側(cè)、頂三個(gè)面的面積。/*案例代碼文件名:al7_9.c*/*功能

21、:利用全局變量計(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=%dn,v,s1,s2,s3); getch(); 程序演示對(duì)于全局變量還有以下幾點(diǎn)說(shuō)明:(1)外部變量

22、可加強(qiáng)函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,但又使這些函數(shù)依賴(lài)這些外部變量,因而使得這些函數(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ù)類(lèi)型 外部變量,外部變量2; 注意注意:外部變量的定義和外部變量的說(shuō)明是兩回事。外部變量的定義,必須在所有的函數(shù)之外,且只能定義一次。而外部變量的說(shuō)明,出現(xiàn)在

23、要使用該外部變量的函數(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=%dnv=%d,xl,xw,xh,vs(xl,xw); int xl=3,xw=4,xh=5; /*外部變量xl、xw、

24、xh的定義*/程序演示return7.5 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù) 7.5.1 內(nèi)部函數(shù)(又稱(chēng)靜態(tài)函數(shù))內(nèi)部函數(shù)(又稱(chēng)靜態(tài)函數(shù)) 7.5.2 外部函數(shù)外部函數(shù) 7.5.3 多個(gè)源程序文件的編譯和連接多個(gè)源程序文件的編譯和連接 當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),語(yǔ)言根據(jù)函數(shù)能否被其它源文件中的函數(shù)調(diào)用,將函數(shù)分為內(nèi)部函數(shù)內(nèi)部函數(shù)和外部函數(shù)外部函數(shù)。return7.5.1 內(nèi)部函數(shù)(又稱(chēng)靜態(tài)函數(shù))內(nèi)部函數(shù)(又稱(chēng)靜態(tài)函數(shù))如果在一個(gè)源文件中定義的函數(shù),只能被本文件中的函數(shù)調(diào)用,而不能被同一程序其它文件中的函數(shù)調(diào)用,這種函數(shù)稱(chēng)為內(nèi)部函數(shù)。定義一個(gè)內(nèi)部函數(shù),只需在函數(shù)類(lèi)型前再加一個(gè)“stati

25、c”關(guān)鍵字即可,如下所示:static 函數(shù)類(lèi)型 函數(shù)名(函數(shù)參數(shù)表) 關(guān)鍵字“static”,譯成中文就是“靜態(tài)的”,所以?xún)?nèi)部函數(shù)又稱(chēng)靜態(tài)函數(shù)。但此處“static”的含義不是指存儲(chǔ)方式,而是指對(duì)函數(shù)的作用域僅局限于本文件。使用內(nèi)部函數(shù)的好處是:不同的人編寫(xiě)不同的函數(shù)時(shí),不用擔(dān)心自己定義的函數(shù),是否會(huì)與其它文件中的函數(shù)同名,因?yàn)橥矝](méi)有關(guān)系。return7.5.2 外部函數(shù)外部函數(shù)外部函數(shù)的定義:在定義函數(shù)時(shí),如果沒(méi)有加關(guān)鍵字“static”,或冠以關(guān)鍵字“extern”,表示此函數(shù)是外部函數(shù):extern 函數(shù)類(lèi)型 函數(shù)名(函數(shù)參數(shù)表) 調(diào)用外部函數(shù)時(shí),需要對(duì)其進(jìn)行說(shuō)明:extern 函

26、數(shù)類(lèi)型函數(shù)類(lèi)型 函數(shù)名函數(shù)名(參數(shù)類(lèi)型表參數(shù)類(lèi)型表),函數(shù)名,函數(shù)名2(參數(shù)類(lèi)型表參數(shù)類(lèi)型表2);案例案例7.11 外部函數(shù)應(yīng)用。(1)文件mainf.cmain() extern void input(),process(),output(); input(); process(); output(); (2)文件subf1.cextern void input()/*定義外部函數(shù)*/ (3)文件subf2.cextern void process()/*定義外部函數(shù)*/ (4)文件subf3.cextern void output()/*定義外部函數(shù)*/ return7.5.3 多個(gè)源程序

27、文件的編譯和連接多個(gè)源程序文件的編譯和連接 (1)一般過(guò)程編輯各源文件 創(chuàng)建project(項(xiàng)目)文件 設(shè)置項(xiàng)目名稱(chē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)目名稱(chēng)設(shè)置項(xiàng)目名稱(chēng)打開(kāi)菜單,選取projectproject name,輸入項(xiàng)目文件名即可。(4)編譯、連接,運(yùn)行,查看結(jié)果)編譯、連接,運(yùn)行,查看結(jié)果與單個(gè)

28、源文件相同。編譯產(chǎn)生的目標(biāo)文件,以及連接產(chǎn)生的可執(zhí)行文件,它們的主文件名,均與項(xiàng)目文件的主文件名相同。注意注意:當(dāng)前項(xiàng)目文件調(diào)試完畢后,應(yīng)選取projectclear project,將其項(xiàng)目名稱(chēng)從“project name”中清除(清除后為空)。否則,編譯、連接和運(yùn)行的,始終是該項(xiàng)目文件?。?)關(guān)于錯(cuò)誤跟蹤)關(guān)于錯(cuò)誤跟蹤缺省時(shí),僅跟蹤當(dāng)前一個(gè)源程序文件。如果希望自動(dòng)跟蹤項(xiàng)目中的所有源文件,則應(yīng)將optionsenvironmentmessage tracking開(kāi)關(guān)置為“all files ”:連續(xù)按回車(chē)鍵,直至“all files”出現(xiàn)為止。此時(shí),滾動(dòng)消息窗口中的錯(cuò)誤信息時(shí),系統(tǒng)會(huì)自動(dòng)加載

29、相應(yīng)的源文件到編輯窗口中。也可關(guān)閉跟蹤(將“message tracking”置為“off”)。此時(shí),只要定位于感興趣的錯(cuò)誤信息上,然后回車(chē),系統(tǒng)也會(huì)自動(dòng)將相應(yīng)源文件加載到編輯窗口中。return7.6 變量的動(dòng)態(tài)存儲(chǔ)與靜態(tài)存儲(chǔ)簡(jiǎn)介變量的動(dòng)態(tài)存儲(chǔ)與靜態(tài)存儲(chǔ)簡(jiǎn)介 在語(yǔ)言中,對(duì)變量的存儲(chǔ)類(lèi)型說(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ǔ)方式內(nèi)部變量的存儲(chǔ)方式 7.6.2 外部變量的存儲(chǔ)方式外部變量的存儲(chǔ)方式return7

30、.6.1 內(nèi)部變量的存儲(chǔ)方式內(nèi)部變量的存儲(chǔ)方式 1靜態(tài)存儲(chǔ)靜態(tài)內(nèi)部變量(1)定義格式: static 數(shù)據(jù)類(lèi)型 內(nèi)部變量表;(2)存儲(chǔ)特點(diǎn)1)靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ)。在程序執(zhí)行過(guò)程中,即使所在函數(shù)調(diào)用結(jié)束也不釋放。換句話(huà)說(shuō),在程序執(zhí)行期間,靜態(tài)內(nèi)部變量始終存在,但其它函數(shù)是不能引用它們的。2)定義但不初始化,則自動(dòng)賦以(整型和實(shí)型)或0(字符型);且每次調(diào)用它們所在的函數(shù)時(shí),不再重新賦初值,只是保留上次調(diào)用結(jié)束時(shí)的值?。?)何時(shí)使用靜態(tài)內(nèi)部變量1)需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值。2)變量只被引用而不改變其值。2動(dòng)態(tài)存儲(chǔ)動(dòng)態(tài)存儲(chǔ)自動(dòng)局部變量(又稱(chēng)自動(dòng)變量)(1)定義格式定義格式:auto 數(shù)

31、據(jù)類(lèi)型 變量表;(2)存儲(chǔ)特點(diǎn)存儲(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(“

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論