




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第八章 函數(shù)8.1 概述 一個函數(shù)是根據(jù)進(jìn)去的信息(輸入)和產(chǎn)生的東西(輸出結(jié)果)所定義的一個黑盒。在 C 語言函數(shù)中: 我們用參數(shù)把值傳送進(jìn)函數(shù): 我們用 RETURN 把一個值返回調(diào)用函數(shù)。 2) 除main函數(shù)外,其它函數(shù)可相互調(diào)用main ( )abcdxz3)函數(shù)不可嵌套定義,具有全局性、平行性,4)函數(shù)分為有參與無參函數(shù)5)程序從main開始執(zhí)行,最后又回到main函數(shù)結(jié)束。1) 除main外, 其它為系統(tǒng)函數(shù)、自編函數(shù),系統(tǒng)函數(shù):由系統(tǒng)提供,用戶可調(diào)用。編函數(shù):由用戶按語法規(guī)則編寫。C程序由一個main和任意個函數(shù)組成。1. 無參函數(shù)定義形式類型標(biāo)識符 函數(shù)名( ) 說明部分 語
2、句 類型標(biāo)識符: 表示返回值類型。一、函數(shù)定義8.2 函數(shù)定義的一般形式 調(diào)用方式函數(shù)名( ) ;若有返回值可出現(xiàn)在表達(dá)式中無返值可單獨出現(xiàn)例8.1 通過調(diào)用print_space ( ), print_ message( )而顯示: Welcome you to use C language ! 就是無參函數(shù)類型標(biāo)識符 函數(shù)名(形式參數(shù)表列) 說明部分 語句 2. 有參函數(shù) 定義形式例: 求二數(shù)之最大值 int max (int x, int y) int z; z=xy? x:y; return (z); 注意:出現(xiàn)return, 語句,返回值一般與函數(shù)類型一致。有參函數(shù)的構(gòu)造演示:注意:
3、如果在定義函數(shù)時不指定函數(shù)類型,系統(tǒng)會隱含指定函數(shù)類型為int型。它的形式為: 類型說明符 函數(shù)名() 空函數(shù)表示什么工作也不做,沒有任何實際作用。3. 可以有“空函數(shù)”8.3 函數(shù)參數(shù) 當(dāng)調(diào)用一個帶形式參數(shù)的函數(shù)時, 我們用到實際參數(shù)。實際參數(shù)是在調(diào)用時賦給相應(yīng)的形式參數(shù)的特殊的值。調(diào)用函數(shù)實際參數(shù)被調(diào)用函數(shù) 形式參數(shù)一 形參與實參調(diào)用時: 實參值單向傳遞形參。 函數(shù)被調(diào)用時,臨時分配單元給形參,調(diào)用完畢, 這些單元被釋放。實參: 出現(xiàn)在調(diào)用函數(shù)中, 形參: 出現(xiàn)被調(diào)用函數(shù)中。注: 實參可為表達(dá)式,其值傳遞。 實參、形參類型一致。 可在形參表列中對形參說明。例8.1 輸入兩個數(shù),輸出其中較大
4、的數(shù)。#include int max(int x,int y) int t; if(xy) t=x; else t=y; return t;main() int a,b,m; scanf(“%d,%d”,&a,&b);m=max(a,b);/*調(diào)用函數(shù)max(),a,b已有具體的值*/printf(“max=%d”,m);例如運行時輸入:10,5輸出為:10實參a和形參x,實參b和形參y之間值的傳遞如下圖 :關(guān)于形參與實參的說明:在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時,它們并不占內(nèi)存中的存儲單元。只有在調(diào)用時才分配內(nèi)存,調(diào)用結(jié)束時,釋放內(nèi)存。實參可以是常量、變量或表達(dá)式,但要求它們有確定
5、的值。在被定義的函數(shù)中,必須指定形參的類型。實參與形參的類型應(yīng)相同或賦值兼容。實參變量對形參變量的數(shù)據(jù)傳遞是“值傳遞”,即單向傳遞,只由實參傳給形參,而不能由形參傳回來給實參。在內(nèi)存中,實參單元與形參單元是不同的單元。二 函數(shù)返回值 1)通過return語句將返回值傳給函數(shù)名,可有多個return.變量等return (表達(dá)式);通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)得到一個確定的值。這就是函數(shù)的返回值。說明:如果需要從被調(diào)用函數(shù)帶回一個函數(shù)值,被調(diào)用函數(shù)中必須包含return語句。如果不需要從被調(diào)用函數(shù)帶回函數(shù)值可以不要return語句,或者用return 0; 一個函數(shù)中可以有一個以上的retu
6、rn語句,執(zhí)行到哪個return語句,哪個語句起作用。 2) 函數(shù)值的類型。既然函數(shù)有返回值,這個值當(dāng)然應(yīng)屬于某一個確定的類型,應(yīng)當(dāng)在定義函數(shù)時指定函數(shù)值的類型。凡不加類型說明的函數(shù),一律按整型處理。 在定義函數(shù)時對函數(shù)值說明的類型一般應(yīng)該和return語句中的表達(dá)式類型一致。如果函數(shù)值的類型和return語句中的表達(dá)式的值不一致,則以函數(shù)類型為準(zhǔn)。return語句后面的括弧也可以不要,如:return z;與“return (z);”等價。return 后面的值可以是一個表達(dá)式。如:max(int x,int y) return(xy?x:y);例8.2 設(shè)求最大公約數(shù)的程序如下:#incl
7、ude int divisor(int a,int b)int r;do r=a%b; a=b; /*形式參數(shù)的值在函數(shù)被改變*/ b=r; while(r!=0);return a;main()int a,b,d;scanf(“%d,%d”,&a,&b);if(ab) /*把較大的數(shù)傳給函數(shù)的第一個參數(shù)*/ d=divisor(a,b); /*實參與形參同名*/else d=divisor(b,a);printf(“a=%d,b=%dn”,a,b); /*變量a和b的值不會被函數(shù)改變*/printf(“d=%d”,d);注意:函數(shù)的按值傳遞和按地址傳遞的區(qū)別。 函數(shù)divisor中的形式參數(shù)
8、的a得到實參a的值,而形參b得到實參b的值。divisor中a和b值的改變并不影響主函數(shù)中的a和b。所以輸出結(jié)果為: a=21,b=15 d3 如果程序運行時輸入的是:15,2l 函數(shù)divisor中的形式參數(shù)的a得到實參b的值,而形參b得到實參a的值。則輸出結(jié)果為: a=15,b21 d3一 函數(shù)調(diào)用的一般形式函數(shù)名(實參表列); 1)如果是調(diào)用無參函數(shù),則“實參表列”可以沒有,但括弧不能省略。 2)如果實參表列包含多個實參,則各參數(shù)間用逗號隔開。實參與形參的個數(shù)應(yīng)相等,類型應(yīng)一致。實參與形參按順序?qū)?yīng),一一傳遞數(shù)據(jù)。 3)實參傳遞給形參時,實參的計算有的系統(tǒng)自左至右,有的自右至左。8.4
9、函數(shù)的調(diào)用二 函數(shù)調(diào)用的方式 按函數(shù)在程序中出現(xiàn)的位置來分,可以有以下三種函數(shù)調(diào)用方式:1、函數(shù)語句把函數(shù)調(diào)用作為一個語句。如例8.1中的printstar();這時不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。2、函數(shù)表達(dá)式函數(shù)出現(xiàn)在一個表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式。這時要求函數(shù)帶回一個確定的值以參加表達(dá)式的運算。例:c=2*max(a,b);函數(shù)max是表達(dá)式的一部分,它的值乘以2再賦給c。3、函數(shù)參數(shù) 函數(shù)調(diào)用作為一個函數(shù)的實參。例:m=max(a,m(b,c); 其中max(b,c)是一次函數(shù)調(diào)用,它的值作為max另一次調(diào)用的實參。 m的值是a、b、c三者最大的。又如:printf
10、(“%d”,max(a,b);也是把max(a,b)作為printf函數(shù)的一個參數(shù)。三 對被調(diào)用函數(shù)的聲明和函數(shù)原型在一個函數(shù)中調(diào)用另一個函數(shù),需要具備哪些條件呢? 1)首先被調(diào)函數(shù)必須是已存在的函數(shù)(是庫函數(shù)或用戶自己定義的函數(shù))。 2)如果使用庫函數(shù),一般還應(yīng)該在本文件開頭用 #include 命令將調(diào)用庫函數(shù)時所需用到的信息“包含”到本文件中來。 3) 調(diào)用函數(shù)應(yīng)對被調(diào)用函數(shù)的返回值類型作出說明: (函數(shù)名相當(dāng)于一變量,但應(yīng)有所區(qū)別)類型符 函數(shù)名( );它不同于函數(shù)的定義(功能定義) 例8.3 : 求二實數(shù)之和 main ( ) float add( float x,float y);
11、 float a, b, c; scanf(%f, %f,&a, &b); c=add(a, b); printf (sum= %f;c); float add( float x, float y); float z; z=x+y; return z; 注意:以下幾種情況可省略對被調(diào)函數(shù)的說明: 1)當(dāng)返回值為整型、字符型。 2) 在調(diào)用之前定義函數(shù)。 3) 在整個文件的開頭定義函數(shù)。函數(shù)原型在c語言中,函數(shù)聲明稱為函數(shù)原型(function prototype)函數(shù)原型的一般形式:(1)函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)類型2,)(2)函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)名1,參數(shù)類型2,參數(shù)
12、名2,) 應(yīng)當(dāng)保證函數(shù)原型與函數(shù)首部寫法上的一致,即函數(shù)類型、函數(shù)名、參數(shù)個數(shù)、參數(shù)類型和參數(shù)順序必須相同。函數(shù)調(diào)用時函數(shù)名、實參類型必須與函數(shù)原型中的形參類型賦值兼容。說明: 1)以前的C版本函數(shù)聲明方式不是采用函數(shù)原型,而只聲明函數(shù)名和函數(shù)類型。例如在例8.5中,也可寫成: float add( );新版本也兼容這種寫法,但不提倡這種用法。 2)如果在函數(shù)調(diào)用之前,沒有對函數(shù)作聲明,則編譯系統(tǒng)會把第一次遇到的該函數(shù)形式(函數(shù)定義或函數(shù)調(diào)用)作為函數(shù)的聲明,并將函數(shù)類型默認(rèn)為int型。 3)如果被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,可以不加聲明。 4)如果已在所有函數(shù)定義之前,在函數(shù)外部已做了
13、函數(shù)聲明,則在各個主調(diào)函數(shù)中不必對所調(diào)用的函數(shù)再作聲明。 C語言不能嵌套定義,但可以嵌套調(diào)用函數(shù)。也就是說,在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù)。 8.5 函數(shù)的嵌套與遞歸調(diào)用 請看下圖:一、函數(shù)嵌套調(diào)用f1( )調(diào)用f2函數(shù) f2( ) main 調(diào)用f1函數(shù) 結(jié)束 上圖是兩層嵌套(連main函數(shù)共3層函數(shù)),其執(zhí)行過程是: (1)執(zhí)行main函數(shù)的開頭部分; (2)遇函數(shù)調(diào)用f1的操作語句,流程轉(zhuǎn)去f1函數(shù); (3)執(zhí)行f1函數(shù)的開頭部分; (4)遇調(diào)用f2函數(shù)的操作語句,流程轉(zhuǎn)去函數(shù)f2; (5)執(zhí)行f2函數(shù),如果再無其他嵌套的函數(shù),則完成f2函數(shù)的全部操作; (6)返回調(diào)用f2函數(shù)
14、處,即返回f1函數(shù); (7)繼續(xù)執(zhí)行f1函數(shù)中尚未執(zhí)行的部分,直到f1函數(shù)結(jié)束; (8)返回main函數(shù)中調(diào)用f1函數(shù)處; (9)繼續(xù)執(zhí)行main函數(shù)的剩余部分直到結(jié)束。例:計算s=13+23+33+103 方法如下:long f2(int n,int k) /*計算n的k次方*/ long power=n; int i; for(i=1;ik;i+) power *= n; return power; long f1(int n,int k) /*計算1到n的k次方之累加和*/long sum=0;int i;for(i=1;i1)即: 條件成立,調(diào)用遞歸,否則結(jié)束。一個最常用的例子: 求n
15、!1. 從數(shù)學(xué)上定義 2、程序: float fac( int n) float f; if (n%cn , getone, putone); void hanoi (n, one, two, three) /*將n個盤從one借助two,移動three*/ char one, two, three; int n; if (n= =1) move (one, three); else hanoi (n1, one, three, two); move (one, three); hanoi (n1, two, one, three); main ( ) int m; printf ( inpu
16、t the number of disdes :); scanf( %d ,&m); printf( The step to moving %3d disdes:n , m); hanoi (m, A, B, C);運行情況如下: input the number of disdes:3 The step to moving 3 diskes: A C A B C B A C B A B C A C兩個函數(shù): move (getone, putone) 表示從getone 塔移一個盤子至putone塔 hanoi(n, one, two, three) 表示n個盤子從one塔借助于two塔(空
17、)移至three塔。 調(diào)用時塔用字符常量A , B , C 表示。讓我們看一看, 當(dāng)盤數(shù)是 3 時, towers() 的執(zhí)行情況。數(shù)組用作函數(shù)參數(shù)有兩種形式:一種是把數(shù)組元素(又稱下標(biāo)變量)作為實參使用;另一種是把數(shù)組名作為函數(shù)的形參和實參使用。 1 數(shù)組元素作為函數(shù)參數(shù) 數(shù)組元素就是下標(biāo)變量,它與普通變量并無區(qū)別。數(shù)組元素只能用作函數(shù)實參,其用法與普通變量完全相同:在發(fā)生函數(shù)調(diào)用時,把數(shù)組元素的值傳送給形參,實現(xiàn)單向值傳送。8.7 數(shù)組作為函數(shù)參數(shù)例8.7寫一函數(shù),統(tǒng)計字符串中字母的個數(shù)。int isalpha(char c) if (c=a&c=A&c=Z) return(1); els
18、e return(0); /*返回一個標(biāo)志,標(biāo)記是否字母*/ main() int i,num=0; char str255; printf(Input a string: ); gets(str); for(i=0;stri!=0;i+) if (isalpha(stri) num+; /*若是字母標(biāo)記為1,則為真,num+1*/ puts(str); printf(num=%dn,num); getch(); 說明:(1)用數(shù)組元素作實參時,只要數(shù)組類型和函數(shù)的形參類型一致即可,并不要求函數(shù)的形參也是下標(biāo)變量。換句話說,對數(shù)組元素的處理是按普通變量對待的。(2)在普通變量或下標(biāo)變量作函數(shù)參
19、數(shù)時,形參變量和實參變量是由編譯系統(tǒng)分配的兩個不同的內(nèi)存單元。在函數(shù)調(diào)用時發(fā)生的值傳送,是把實參變量的值賦予形參變量。2 數(shù)組名作函數(shù)參數(shù)時,既可以作形參,也可以作實參。數(shù)組名作函數(shù)參數(shù)時,要求形參和相對應(yīng)的實參都必須是類型相同的數(shù)組(或指向數(shù)組的指針變量),都必須有明確的數(shù)組說明例8.8 已知某個學(xué)生5門課程的成績,求平均成績。float aver(float a ) /*求平均值函數(shù)*/ int i; float av,s=a0; for(i=1;i5;i+) s += ai; av=s/5; return av; void main() float sco5,av; int i; pri
20、ntf(ninput 5 scores:n); for(i=0;i5;i+) scanf(%f,&scoi); av=aver(sco);/*調(diào)用函數(shù),實參為一數(shù)組名*/ printf(average score is %5.2fn,av); getch(); 說明:(1)用數(shù)組名作函數(shù)參數(shù),應(yīng)該在調(diào)用函數(shù)和被調(diào)用函數(shù)中分別定義數(shù)組,且數(shù)據(jù)類型必須一致,否則結(jié)果將出錯。例如,在本例中,形參數(shù)組為a,實參數(shù)組為sco,它們的數(shù)據(jù)類型相同。(2)C編譯系統(tǒng)對形參數(shù)組大小不作檢查,所以形參數(shù)組可以不指定大小。例如,本例中的形參數(shù)組a。 如果指定形參數(shù)組的大小,則實參數(shù)組的大小必須大于等于形參數(shù)組,否
21、則因形參數(shù)組的部分元素沒有確定值而導(dǎo)致計算結(jié)果錯誤。(3) 應(yīng)該注意,用數(shù)組名作函數(shù)實參時,不是把數(shù)組元素的值傳遞給形參,而是把實參數(shù)組的起始地址傳遞給形參數(shù)組,這樣兩個數(shù)組就共占同一段內(nèi)存單元。因此可以看出,形參數(shù)組中各元素的值如果發(fā)生變化會使實參數(shù)組元素的值同時發(fā)生變化。例:用選擇法對數(shù)組中10個整數(shù)按有小到大排序。void sort( int array , int n) main() int i, j, k, t; int a10, i; for(i=0; in-1; i+) printf(“enter the arrayn”); k=i; for(i=0; i10; i+) for(
22、j=i+1;jn;j+) scanf(“%d”, &ai); if(arrayjarrayk) k=j; sort(a, 10); t=arrayk; printf(“the sorted array:n”); arrayk=arrayi; for(i=0; i10; i+) arrayi=t; printf(“%d ”,ai); printf(“n”); 8.8 局部變量和全局變量 變量的作用域變量有效的范圍稱變量的作用域。 C語言中所有的變量都有自己的作用域。變量說明的方式不同,其作用域也不同。C語言中的變量,按作用域范圍可分為兩種,即局部變量和全局變量。8.8.1 局部變量在一個函數(shù)內(nèi)部
23、說明的變量是局部變量,它只在該函數(shù)范圍內(nèi)有效。在此函數(shù)之外就不能使用這些變量了。所以局部變量也稱“內(nèi)部變量”。例如:int 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)于局部變量的作用域還要說明以下幾點:1主函數(shù)main()中定義的局部變量,也只能在主函數(shù)中使用,其它函數(shù)不能使用。同時,主函數(shù)中也不能使用其它函數(shù)中定義的局部變量。因為主函數(shù)也是一個函
24、數(shù),與其它函數(shù)是平行關(guān)系。這一點是與其它語言不同的,應(yīng)予以注意。2形參變量也是局部變量,屬于被調(diào)用函數(shù);實參變量,則是調(diào)用函數(shù)的局部變量。3允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對象,分配不同的單元,互不干擾,也不會發(fā)生混淆。4在復(fù)合語句中也可定義變量,其作用域只在復(fù)合語句范圍內(nèi)。 8.8.2 全局變量 在函數(shù)外部定義的變量稱為全局變量。以此類推,在函數(shù)外部定義的數(shù)組就稱為外部數(shù)組。 全局變量不屬于任何一個函數(shù),其作用域是:從全局變量的定義位置開始,到本文件結(jié)束為止。 全局變量可被作用域內(nèi)的所有函數(shù)直接引用,所以全局變量又稱外部變量。例 輸入長方體的長(l)、寬(w)、高(h),求
25、長方體體積及正、側(cè)、頂三個面的面積。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(); 對于全局變量還有以下幾點說明:(1)全局變量
26、可加強(qiáng)函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,但又使這些函數(shù)依賴這些全局變量,因而使得這些函數(shù)的獨立性降低。從模塊化程序設(shè)計的觀點來看這是不利的,因此不是非用不可時,不要使用全局變量。(2)在同一源文件中,允許全局變量和局部變量同名。在局部變量的作用域內(nèi),全局變量將被屏蔽而不起作用。(3)全局變量的作用域是從定義點到本文件結(jié)束。如果定義點之前的函數(shù)需要引用這些全局變量時,需要在函數(shù)內(nèi)對被引用的全局變量進(jìn)行說明。全局變量說明的一般形式為: extern 數(shù)據(jù)類型 全局變量,全局變量2; 注意:全局變量的定義和全局變量的說明是兩回事。全局變量的定義,必須在所有的函數(shù)之外,且只能定義一次。而外部變量的說明,出現(xiàn)在要
27、使用該外部變量的函數(shù)內(nèi),而且可以出現(xiàn)多次。 例 外部變量的定義與說明。int vs(int xl,int xw) extern int xh; /*外部變量xh的說明*/ int v; v=xl*xw*xh; /*直接使用外部變量xh的值*/ return v; main() extern int xw,xh; /*外部變量的說明*/ 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、xh的定義*/一、變量的存儲類別程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲
28、區(qū)數(shù)據(jù),變量存放內(nèi)存分配C語言特有的方式。表達(dá)了一個變量存在的時間。8.9 變量的存儲方式靜態(tài)存儲變量: 存放于靜態(tài)存儲區(qū),在程序整個運行過程中,始終占據(jù)固定的內(nèi)存單元。 在C語言中,根據(jù)變量的作用域來分,可以分為:全局變量和局部變量,根據(jù)變量的存在時間來分:可以分為靜態(tài)存儲方式和動態(tài)存儲方式。以上為兩大類,又分為四種具體形式自動型(auto)變量靜態(tài)(static)變量寄存器型(register)變量 外部(extern)變量 前面學(xué)習(xí)的局部、全局變量均以上述方式中的一種形式存儲。動態(tài)存儲變量: 存放于動態(tài)存儲區(qū),根據(jù)程序的運行狀態(tài)(如:函數(shù)調(diào)用)而臨時分配的單元,且單元并不固定。1動態(tài)存儲
29、自動局部變量(又稱自動變量)(1)定義格式:auto 數(shù)據(jù)類型 變量表;(2)存儲特點1)自動變量屬于動態(tài)存儲方式。在函數(shù)中定義的自動變量,只在該函數(shù)內(nèi)有效;函數(shù)被調(diào)用時分配存儲空間,調(diào)用結(jié)束就釋放。在復(fù)合語句中定義的自動變量,只在該復(fù)合語句中有效;退出復(fù)合語句后,也不能再使用,否則將引起錯誤。2)定義而不初始化,則其值是不確定的。如果初始化,則賦初值操作是在調(diào)用時進(jìn)行的,且每次調(diào)用都要重新賦一次初值。3)由于自動變量的作用域和生存期,都局限于定義它的個體內(nèi)(函數(shù)或復(fù)合語句),因此不同的個體中允許使用同名的變量而不會混淆。即使在函數(shù)內(nèi)定義的自動變量,也可與該函數(shù)內(nèi)部的復(fù)合語句中定義的自動變量同
30、名。建議:系統(tǒng)不會混淆,并不意味著人也不會混淆,所以盡量少用同名自動變量! 8.9.1 內(nèi)部變量的存儲方式現(xiàn)在, 我們看一個例子:2靜態(tài)存儲靜態(tài)內(nèi)部變量(1)定義格式: static 數(shù)據(jù)類型 內(nèi)部變量表;(2)存儲特點1)靜態(tài)內(nèi)部變量屬于靜態(tài)存儲。在程序執(zhí)行過程中,即使所在函數(shù)調(diào)用結(jié)束也不釋放。換句話說,在程序執(zhí)行期間,靜態(tài)內(nèi)部變量始終存在,但其它函數(shù)是不能引用它們的。2)定義但不初始化,則自動賦以(整型和實型)或0(字符型);且每次調(diào)用它們所在的函數(shù)時,不再重新賦初值,只是保留上次調(diào)用結(jié)束時的值?。?)何時使用靜態(tài)內(nèi)部變量1)需要保留函數(shù)上一次調(diào)用結(jié)束時的值。2)變量只被引用而不改變其值。
31、現(xiàn)在, 我們看一個例子: int fac (int n) static int f=1; f=fn; return(f); main ( ) int i; for (i=1; i=5; i+) printf (%d!=%dn, i, fac(i); 例:求n!運行結(jié)果為: 1!1 2!2 3!6 4!24 5!120 每一次調(diào)用fac(i),打印一個i!,同時保留這個i!的值以便下次再乘(i+1)。3寄存器存儲寄存器變量一般情況下,變量的值都是存儲在內(nèi)存中的。為提高執(zhí)行效率,語言允許將局部變量的值存放到寄存器中,這種變量就稱為寄存器變量。定義格式如下: register 數(shù)據(jù)類型 變量表;(1
32、)只有局部變量才能定義成寄存器變量,即全局變量不行。(2)對寄存器變量的實際處理,隨系統(tǒng)而異。例如,微機(jī)上的MSC和TC 將寄存器變量實際當(dāng)作自動變量處理。(3)允許使用的寄存器數(shù)目是有限的,不能定義任意多個寄存器變量。8.9.2 外部變量的存儲方式外部變量屬于靜態(tài)存儲方式: (1)靜態(tài)外部變量只允許被本源文件中的函數(shù)引用其定義格式為: static 數(shù)據(jù)類型 外部變量表;(2)非靜態(tài)外部變量允許被其它源文件中的函數(shù)引用定義時缺省static關(guān)鍵字的外部變量,即為非靜態(tài)外部變量。其它源文件中的函數(shù),引用非靜態(tài)外部變量時,需要在引用函數(shù)所在的源文件中進(jìn)行說明: extern 數(shù)據(jù)類型 外部變量表
33、;注意:在函數(shù)內(nèi)的extern變量說明,表示引用本源文件中的外部變量!而函數(shù)外(通常在文件開頭)的extern變量說明,表示引用其它文件中的外部變量。允許被其它源文件中的函數(shù)引用 int a; main( ) extern int a; fac(x) int x z=a 文件f1.c文件f2.c用到f1.c 中的a f2.c中的extern在函數(shù)外說明,在函數(shù)內(nèi)說明已敘述過。 靜態(tài)局部變量和靜態(tài)外部變量同屬靜態(tài)存儲方式,但兩者區(qū)別較大:(1)定義的位置不同。靜態(tài)局部變量在函數(shù)內(nèi)定義,靜態(tài)外部變量在函數(shù)外定義。(2)作用域不同。靜態(tài)局部變量屬于內(nèi)部變量,其作用域僅限于定義它的函數(shù)內(nèi);雖然生存期為
34、整個源程序,但其它函數(shù)是不能使用它的。 靜態(tài)外部變量在函數(shù)外定義,其作用域為定義它的源文件內(nèi);生存期為整個源程序,但其它源文件中的函數(shù)也是不能使用它的。(3)初始化處理不同。靜態(tài)局部變量,僅在第1次調(diào)用它所在的函數(shù)時被初始化,當(dāng)再次調(diào)用定義它的函數(shù)時,不再初始化,而是保留上1次調(diào)用結(jié)束時的值。而靜態(tài)外部變量是在函數(shù)外定義的,不存在靜態(tài)內(nèi)部變量的“重復(fù)”初始化問題,其當(dāng)前值由最近1次給它賦值的操作決定。存儲類別總結(jié) 見表函數(shù)內(nèi)函數(shù)外作用域存在性作用域存在性 auto register static 局部 static 全部 本文件 不加 static 全局(外部) 務(wù)必牢記:把局部變量改變?yōu)殪o態(tài)
35、內(nèi)部變量后,改變了它的存儲方式,即改變了它的生存期。把外部變量改變?yōu)殪o態(tài)外部變量后,改變了它的作用域,限制了它的使用范圍。因此,關(guān)鍵字“static”在不同的地方所起的作用是不同的。8.10 內(nèi)部函數(shù)和外部函數(shù) 當(dāng)一個源程序由多個源文件組成時,語言根據(jù)函數(shù)能否被其它源文件中的函數(shù)調(diào)用,將函數(shù)分為內(nèi)部函數(shù)和外部函數(shù)。8.10.1 內(nèi)部函數(shù)(又稱靜態(tài)函數(shù))如果在一個源文件中定義的函數(shù),只能被本文件中的函數(shù)調(diào)用,而不能被同一程序其它文件中的函數(shù)調(diào)用,這種函數(shù)稱為內(nèi)部函數(shù)。定義一個內(nèi)部函數(shù),只需在函數(shù)類型前再加一個“static”關(guān)鍵字即可,如下所示:static 函數(shù)類型 函數(shù)名(函數(shù)參數(shù)表) 關(guān)鍵
36、字“static”,譯成中文就是“靜態(tài)的”,所以內(nèi)部函數(shù)又稱靜態(tài)函數(shù)。但此處“static”的含義不是指存儲方式,而是指對函數(shù)的作用域僅局限于本文件。使用內(nèi)部函數(shù)的好處是:不同的人編寫不同的函數(shù)時,不用擔(dān)心自己定義的函數(shù),是否會與其它文件中的函數(shù)同名,因為同名也沒有關(guān)系。8.10.1 內(nèi)部函數(shù)如果在一個源文件中定義的函數(shù),只能被本文件中的函數(shù)調(diào)用,而不能被同一程序其它文件中的函數(shù)調(diào)用,這種函數(shù)稱為內(nèi)部函數(shù)。定義一個內(nèi)部函數(shù),只需在函數(shù)類型前再加一個“static”關(guān)鍵字即可,如下所示:static 函數(shù)類型 函數(shù)名(函數(shù)參數(shù)表) 關(guān)鍵字“static”,譯成中文就是“靜態(tài)的”,所以內(nèi)部函數(shù)又稱
37、靜態(tài)函數(shù)。但此處“static”的含義不是指存儲方式,而是指對函數(shù)的作用域僅局限于本文件。使用內(nèi)部函數(shù)的好處是:不同的人編寫不同的函數(shù)時,不用擔(dān)心自己定義的函數(shù),是否會與其它文件中的函數(shù)同名,因為同名也沒有關(guān)系。8.10.2 外部函數(shù)外部函數(shù)的定義:在定義函數(shù)時,如果沒有加關(guān)鍵字“static”,或冠以關(guān)鍵字“extern”,表示此函數(shù)是外部函數(shù):extern 函數(shù)類型 函數(shù)名(函數(shù)參數(shù)表) 調(diào)用外部函數(shù)時,需要對其進(jìn)行說明:extern 函數(shù)類型 函數(shù)名(參數(shù)類型表),函數(shù)名2(參數(shù)類型表2); 例: 有一個字符串,內(nèi)有若干個字符,程序?qū)⒆址性撟址麆h除去。用外部函數(shù)實現(xiàn)。外部函數(shù)的應(yīng)用
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 音樂美學(xué)視域下舒伯特《水上吟》的演唱實踐研究
- 特色火鍋店餐飲經(jīng)營權(quán)轉(zhuǎn)讓與加盟合同
- 住宅小區(qū)草坪綠化及病蟲害防治合同
- 建設(shè)用地拆房拆遷補償協(xié)議書范本
- 商業(yè)街商鋪場地租賃協(xié)議范本
- 2025年房地產(chǎn)投融資與管理能力考試試卷及答案
- 2025年心理素質(zhì)訓(xùn)練師資格考試試題及答案
- 標(biāo)簽解釋的自動化
- 草花種植基地與園藝公司購銷協(xié)議
- 車輛報廢回收借款合同(環(huán)保處理)
- 生物工程細(xì)胞培養(yǎng)技術(shù)試題
- 2025年房地產(chǎn)開發(fā)經(jīng)營服務(wù)項目投資風(fēng)險評估報告
- EPC項目全流程咨詢管理的核心要點與優(yōu)化策略
- 2025年管道工(技師)職業(yè)技能鑒定理論考試題庫(含答案)
- 一體化污水處理設(shè)備采購安裝及運維 投標(biāo)方案(技術(shù)方案)
- 晉升品質(zhì)主管述職報告
- 雷火灸技術(shù)操作流程圖及考核標(biāo)準(zhǔn)
- 2024年全國高中數(shù)學(xué)聯(lián)賽(四川預(yù)賽)試題含答案
- 北師大版三年級下冊數(shù)學(xué)全冊教案(完整版)教學(xué)設(shè)計含教學(xué)反思
- 電力安全生產(chǎn)十大禁令
- 污水處理廠危險源專項培訓(xùn)
評論
0/150
提交評論