版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第八章 函數(shù)8.1 概述 一個(gè)函數(shù)是根據(jù)進(jìn)去的信息(輸入)和產(chǎn)生的東西(輸出結(jié)果)所定義的一個(gè)黑盒。在 C 語言函數(shù)中: 我們用參數(shù)把值傳送進(jìn)函數(shù): 我們用 RETURN 把一個(gè)值返回調(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程序由一個(gè)main和任意個(gè)函數(shù)組成。1. 無參函數(shù)定義形式類型標(biāo)識(shí)符 函數(shù)名( ) 說明部分 語
2、句 類型標(biāo)識(shí)符: 表示返回值類型。一、函數(shù)定義8.2 函數(shù)定義的一般形式 調(diào)用方式函數(shù)名( ) ;若有返回值可出現(xiàn)在表達(dá)式中無返值可單獨(dú)出現(xiàn)例8.1 通過調(diào)用print_space ( ), print_ message( )而顯示: Welcome you to use C language ! 就是無參函數(shù)類型標(biāo)識(shí)符 函數(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í)不指定函數(shù)類型,系統(tǒng)會(huì)隱含指定函數(shù)類型為int型。它的形式為: 類型說明符 函數(shù)名() 空函數(shù)表示什么工作也不做,沒有任何實(shí)際作用。3. 可以有“空函數(shù)”8.3 函數(shù)參數(shù) 當(dāng)調(diào)用一個(gè)帶形式參數(shù)的函數(shù)時(shí), 我們用到實(shí)際參數(shù)。實(shí)際參數(shù)是在調(diào)用時(shí)賦給相應(yīng)的形式參數(shù)的特殊的值。調(diào)用函數(shù)實(shí)際參數(shù)被調(diào)用函數(shù) 形式參數(shù)一 形參與實(shí)參調(diào)用時(shí): 實(shí)參值單向傳遞形參。 函數(shù)被調(diào)用時(shí),臨時(shí)分配單元給形參,調(diào)用完畢, 這些單元被釋放。實(shí)參: 出現(xiàn)在調(diào)用函數(shù)中, 形參: 出現(xiàn)被調(diào)用函數(shù)中。注: 實(shí)參可為表達(dá)式,其值傳遞。 實(shí)參、形參類型一致。 可在形參表列中對(duì)形參說明。例8.1 輸入兩個(gè)數(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);例如運(yùn)行時(shí)輸入:10,5輸出為:10實(shí)參a和形參x,實(shí)參b和形參y之間值的傳遞如下圖 :關(guān)于形參與實(shí)參的說明:在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時(shí),它們并不占內(nèi)存中的存儲(chǔ)單元。只有在調(diào)用時(shí)才分配內(nèi)存,調(diào)用結(jié)束時(shí),釋放內(nèi)存。實(shí)參可以是常量、變量或表達(dá)式,但要求它們有確定
5、的值。在被定義的函數(shù)中,必須指定形參的類型。實(shí)參與形參的類型應(yīng)相同或賦值兼容。實(shí)參變量對(duì)形參變量的數(shù)據(jù)傳遞是“值傳遞”,即單向傳遞,只由實(shí)參傳給形參,而不能由形參傳回來給實(shí)參。在內(nèi)存中,實(shí)參單元與形參單元是不同的單元。二 函數(shù)返回值 1)通過return語句將返回值傳給函數(shù)名,可有多個(gè)return.變量等return (表達(dá)式);通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)得到一個(gè)確定的值。這就是函數(shù)的返回值。說明:如果需要從被調(diào)用函數(shù)帶回一個(gè)函數(shù)值,被調(diào)用函數(shù)中必須包含return語句。如果不需要從被調(diào)用函數(shù)帶回函數(shù)值可以不要return語句,或者用return 0; 一個(gè)函數(shù)中可以有一個(gè)以上的retu
6、rn語句,執(zhí)行到哪個(gè)return語句,哪個(gè)語句起作用。 2) 函數(shù)值的類型。既然函數(shù)有返回值,這個(gè)值當(dāng)然應(yīng)屬于某一個(gè)確定的類型,應(yīng)當(dāng)在定義函數(shù)時(shí)指定函數(shù)值的類型。凡不加類型說明的函數(shù),一律按整型處理。 在定義函數(shù)時(shí)對(duì)函數(shù)值說明的類型一般應(yīng)該和return語句中的表達(dá)式類型一致。如果函數(shù)值的類型和return語句中的表達(dá)式的值不一致,則以函數(shù)類型為準(zhǔn)。return語句后面的括弧也可以不要,如:return z;與“return (z);”等價(jià)。return 后面的值可以是一個(gè)表達(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ù)的第一個(gè)參數(shù)*/ d=divisor(a,b); /*實(shí)參與形參同名*/else d=divisor(b,a);printf(“a=%d,b=%dn”,a,b); /*變量a和b的值不會(huì)被函數(shù)改變*/printf(“d=%d”,d);注意:函數(shù)的按值傳遞和按地址傳遞的區(qū)別。 函數(shù)divisor中的形式參數(shù)
8、的a得到實(shí)參a的值,而形參b得到實(shí)參b的值。divisor中a和b值的改變并不影響主函數(shù)中的a和b。所以輸出結(jié)果為: a=21,b=15 d3 如果程序運(yùn)行時(shí)輸入的是:15,2l 函數(shù)divisor中的形式參數(shù)的a得到實(shí)參b的值,而形參b得到實(shí)參a的值。則輸出結(jié)果為: a=15,b21 d3一 函數(shù)調(diào)用的一般形式函數(shù)名(實(shí)參表列); 1)如果是調(diào)用無參函數(shù),則“實(shí)參表列”可以沒有,但括弧不能省略。 2)如果實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù)間用逗號(hào)隔開。實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類型應(yīng)一致。實(shí)參與形參按順序?qū)?yīng),一一傳遞數(shù)據(jù)。 3)實(shí)參傳遞給形參時(shí),實(shí)參的計(jì)算有的系統(tǒng)自左至右,有的自右至左。8.4
9、函數(shù)的調(diào)用二 函數(shù)調(diào)用的方式 按函數(shù)在程序中出現(xiàn)的位置來分,可以有以下三種函數(shù)調(diào)用方式:1、函數(shù)語句把函數(shù)調(diào)用作為一個(gè)語句。如例8.1中的printstar();這時(shí)不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。2、函數(shù)表達(dá)式函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式。這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算。例:c=2*max(a,b);函數(shù)max是表達(dá)式的一部分,它的值乘以2再賦給c。3、函數(shù)參數(shù) 函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參。例:m=max(a,m(b,c); 其中max(b,c)是一次函數(shù)調(diào)用,它的值作為max另一次調(diào)用的實(shí)參。 m的值是a、b、c三者最大的。又如:printf
10、(“%d”,max(a,b);也是把max(a,b)作為printf函數(shù)的一個(gè)參數(shù)。三 對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù),需要具備哪些條件呢? 1)首先被調(diào)函數(shù)必須是已存在的函數(shù)(是庫函數(shù)或用戶自己定義的函數(shù))。 2)如果使用庫函數(shù),一般還應(yīng)該在本文件開頭用 #include 命令將調(diào)用庫函數(shù)時(shí)所需用到的信息“包含”到本文件中來。 3) 調(diào)用函數(shù)應(yīng)對(duì)被調(diào)用函數(shù)的返回值類型作出說明: (函數(shù)名相當(dāng)于一變量,但應(yīng)有所區(qū)別)類型符 函數(shù)名( );它不同于函數(shù)的定義(功能定義) 例8.3 : 求二實(shí)數(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; 注意:以下幾種情況可省略對(duì)被調(diào)函數(shù)的說明: 1)當(dāng)返回值為整型、字符型。 2) 在調(diào)用之前定義函數(shù)。 3) 在整個(gè)文件的開頭定義函數(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ù)個(gè)數(shù)、參數(shù)類型和參數(shù)順序必須相同。函數(shù)調(diào)用時(shí)函數(shù)名、實(shí)參類型必須與函數(shù)原型中的形參類型賦值兼容。說明: 1)以前的C版本函數(shù)聲明方式不是采用函數(shù)原型,而只聲明函數(shù)名和函數(shù)類型。例如在例8.5中,也可寫成: float add( );新版本也兼容這種寫法,但不提倡這種用法。 2)如果在函數(shù)調(diào)用之前,沒有對(duì)函數(shù)作聲明,則編譯系統(tǒng)會(huì)把第一次遇到的該函數(shù)形式(函數(shù)定義或函數(shù)調(diào)用)作為函數(shù)的聲明,并將函數(shù)類型默認(rèn)為int型。 3)如果被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,可以不加聲明。 4)如果已在所有函數(shù)定義之前,在函數(shù)外部已做了
13、函數(shù)聲明,則在各個(gè)主調(diào)函數(shù)中不必對(duì)所調(diào)用的函數(shù)再作聲明。 C語言不能嵌套定義,但可以嵌套調(diào)用函數(shù)。也就是說,在調(diào)用一個(gè)函數(shù)的過程中,又調(diào)用另一個(gè)函數(shù)。 8.5 函數(shù)的嵌套與遞歸調(diào)用 請(qǐng)看下圖:一、函數(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é)束。例:計(jì)算s=13+23+33+103 方法如下:long f2(int n,int k) /*計(jì)算n的k次方*/ long power=n; int i; for(i=1;ik;i+) power *= n; return power; long f1(int n,int k) /*計(jì)算1到n的k次方之累加和*/long sum=0;int i;for(i=1;i1)即: 條件成立,調(diào)用遞歸,否則結(jié)束。一個(gè)最常用的例子: 求n
15、!1. 從數(shù)學(xué)上定義 2、程序: float fac( int n) float f; if (n%cn , getone, putone); void hanoi (n, one, two, three) /*將n個(gè)盤從one借助two,移動(dòng)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);運(yùn)行情況如下: 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兩個(gè)函數(shù): move (getone, putone) 表示從getone 塔移一個(gè)盤子至putone塔 hanoi(n, one, two, three) 表示n個(gè)盤子從one塔借助于two塔(空
17、)移至three塔。 調(diào)用時(shí)塔用字符常量A , B , C 表示。讓我們看一看, 當(dāng)盤數(shù)是 3 時(shí), towers() 的執(zhí)行情況。數(shù)組用作函數(shù)參數(shù)有兩種形式:一種是把數(shù)組元素(又稱下標(biāo)變量)作為實(shí)參使用;另一種是把數(shù)組名作為函數(shù)的形參和實(shí)參使用。 1 數(shù)組元素作為函數(shù)參數(shù) 數(shù)組元素就是下標(biāo)變量,它與普通變量并無區(qū)別。數(shù)組元素只能用作函數(shù)實(shí)參,其用法與普通變量完全相同:在發(fā)生函數(shù)調(diào)用時(shí),把數(shù)組元素的值傳送給形參,實(shí)現(xiàn)單向值傳送。8.7 數(shù)組作為函數(shù)參數(shù)例8.7寫一函數(shù),統(tǒng)計(jì)字符串中字母的個(gè)數(shù)。int isalpha(char c) if (c=a&c=A&c=Z) return(1); els
18、e return(0); /*返回一個(gè)標(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ù)組類型和函數(shù)的形參類型一致即可,并不要求函數(shù)的形參也是下標(biāo)變量。換句話說,對(duì)數(shù)組元素的處理是按普通變量對(duì)待的。(2)在普通變量或下標(biāo)變量作函數(shù)參
19、數(shù)時(shí),形參變量和實(shí)參變量是由編譯系統(tǒng)分配的兩個(gè)不同的內(nèi)存單元。在函數(shù)調(diào)用時(shí)發(fā)生的值傳送,是把實(shí)參變量的值賦予形參變量。2 數(shù)組名作函數(shù)參數(shù)時(shí),既可以作形參,也可以作實(shí)參。數(shù)組名作函數(shù)參數(shù)時(shí),要求形參和相對(duì)應(yīng)的實(shí)參都必須是類型相同的數(shù)組(或指向數(shù)組的指針變量),都必須有明確的數(shù)組說明例8.8 已知某個(gè)學(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í)參為一數(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é)果將出錯(cuò)。例如,在本例中,形參數(shù)組為a,實(shí)參數(shù)組為sco,它們的數(shù)據(jù)類型相同。(2)C編譯系統(tǒng)對(duì)形參數(shù)組大小不作檢查,所以形參數(shù)組可以不指定大小。例如,本例中的形參數(shù)組a。 如果指定形參數(shù)組的大小,則實(shí)參數(shù)組的大小必須大于等于形參數(shù)組,否
21、則因形參數(shù)組的部分元素沒有確定值而導(dǎo)致計(jì)算結(jié)果錯(cuò)誤。(3) 應(yīng)該注意,用數(shù)組名作函數(shù)實(shí)參時(shí),不是把數(shù)組元素的值傳遞給形參,而是把實(shí)參數(shù)組的起始地址傳遞給形參數(shù)組,這樣兩個(gè)數(shù)組就共占同一段內(nèi)存單元。因此可以看出,形參數(shù)組中各元素的值如果發(fā)生變化會(huì)使實(shí)參數(shù)組元素的值同時(shí)發(fā)生變化。例:用選擇法對(duì)數(shù)組中10個(gè)整數(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 局部變量在一個(gè)函數(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)于局部變量的作用域還要說明以下幾點(diǎn):1主函數(shù)main()中定義的局部變量,也只能在主函數(shù)中使用,其它函數(shù)不能使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義的局部變量。因?yàn)橹骱瘮?shù)也是一個(gè)函
24、數(shù),與其它函數(shù)是平行關(guān)系。這一點(diǎn)是與其它語言不同的,應(yīng)予以注意。2形參變量也是局部變量,屬于被調(diào)用函數(shù);實(shí)參變量,則是調(diào)用函數(shù)的局部變量。3允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對(duì)象,分配不同的單元,互不干擾,也不會(huì)發(fā)生混淆。4在復(fù)合語句中也可定義變量,其作用域只在復(fù)合語句范圍內(nèi)。 8.8.2 全局變量 在函數(shù)外部定義的變量稱為全局變量。以此類推,在函數(shù)外部定義的數(shù)組就稱為外部數(shù)組。 全局變量不屬于任何一個(gè)函數(shù),其作用域是:從全局變量的定義位置開始,到本文件結(jié)束為止。 全局變量可被作用域內(nèi)的所有函數(shù)直接引用,所以全局變量又稱外部變量。例 輸入長方體的長(l)、寬(w)、高(h),求
25、長方體體積及正、側(cè)、頂三個(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)說明:(1)全局變量
26、可加強(qiáng)函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,但又使這些函數(shù)依賴這些全局變量,因而使得這些函數(shù)的獨(dú)立性降低。從模塊化程序設(shè)計(jì)的觀點(diǎn)來看這是不利的,因此不是非用不可時(shí),不要使用全局變量。(2)在同一源文件中,允許全局變量和局部變量同名。在局部變量的作用域內(nèi),全局變量將被屏蔽而不起作用。(3)全局變量的作用域是從定義點(diǎn)到本文件結(jié)束。如果定義點(diǎn)之前的函數(shù)需要引用這些全局變量時(shí),需要在函數(shù)內(nèi)對(duì)被引用的全局變量進(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的定義*/一、變量的存儲(chǔ)類別程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)
28、區(qū)數(shù)據(jù),變量存放內(nèi)存分配C語言特有的方式。表達(dá)了一個(gè)變量存在的時(shí)間。8.9 變量的存儲(chǔ)方式靜態(tài)存儲(chǔ)變量: 存放于靜態(tài)存儲(chǔ)區(qū),在程序整個(gè)運(yùn)行過程中,始終占據(jù)固定的內(nèi)存單元。 在C語言中,根據(jù)變量的作用域來分,可以分為:全局變量和局部變量,根據(jù)變量的存在時(shí)間來分:可以分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。以上為兩大類,又分為四種具體形式自動(dòng)型(auto)變量靜態(tài)(static)變量寄存器型(register)變量 外部(extern)變量 前面學(xué)習(xí)的局部、全局變量均以上述方式中的一種形式存儲(chǔ)。動(dòng)態(tài)存儲(chǔ)變量: 存放于動(dòng)態(tài)存儲(chǔ)區(qū),根據(jù)程序的運(yùn)行狀態(tài)(如:函數(shù)調(diào)用)而臨時(shí)分配的單元,且單元并不固定。1動(dòng)態(tài)存儲(chǔ)
29、自動(dòng)局部變量(又稱自動(dòng)變量)(1)定義格式:auto 數(shù)據(jù)類型 變量表;(2)存儲(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ù)合語句中定義的自動(dòng)變量,只在該復(fù)合語句中有效;退出復(fù)合語句后,也不能再使用,否則將引起錯(cuò)誤。2)定義而不初始化,則其值是不確定的。如果初始化,則賦初值操作是在調(diào)用時(shí)進(jìn)行的,且每次調(diào)用都要重新賦一次初值。3)由于自動(dòng)變量的作用域和生存期,都局限于定義它的個(gè)體內(nèi)(函數(shù)或復(fù)合語句),因此不同的個(gè)體中允許使用同名的變量而不會(huì)混淆。即使在函數(shù)內(nèi)定義的自動(dòng)變量,也可與該函數(shù)內(nèi)部的復(fù)合語句中定義的自動(dòng)變量同
30、名。建議:系統(tǒng)不會(huì)混淆,并不意味著人也不會(huì)混淆,所以盡量少用同名自動(dòng)變量! 8.9.1 內(nèi)部變量的存儲(chǔ)方式現(xiàn)在, 我們看一個(gè)例子:2靜態(tài)存儲(chǔ)靜態(tài)內(nèi)部變量(1)定義格式: static 數(shù)據(jù)類型 內(nèi)部變量表;(2)存儲(chǔ)特點(diǎn)1)靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ)。在程序執(zhí)行過程中,即使所在函數(shù)調(diào)用結(jié)束也不釋放。換句話說,在程序執(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)變量只被引用而不改變其值。
31、現(xiàn)在, 我們看一個(gè)例子: 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!運(yùn)行結(jié)果為: 1!1 2!2 3!6 4!24 5!120 每一次調(diào)用fac(i),打印一個(gè)i!,同時(shí)保留這個(gè)i!的值以便下次再乘(i+1)。3寄存器存儲(chǔ)寄存器變量一般情況下,變量的值都是存儲(chǔ)在內(nèi)存中的。為提高執(zhí)行效率,語言允許將局部變量的值存放到寄存器中,這種變量就稱為寄存器變量。定義格式如下: register 數(shù)據(jù)類型 變量表;(1
32、)只有局部變量才能定義成寄存器變量,即全局變量不行。(2)對(duì)寄存器變量的實(shí)際處理,隨系統(tǒng)而異。例如,微機(jī)上的MSC和TC 將寄存器變量實(shí)際當(dāng)作自動(dòng)變量處理。(3)允許使用的寄存器數(shù)目是有限的,不能定義任意多個(gè)寄存器變量。8.9.2 外部變量的存儲(chǔ)方式外部變量屬于靜態(tài)存儲(chǔ)方式: (1)靜態(tài)外部變量只允許被本源文件中的函數(shù)引用其定義格式為: static 數(shù)據(jù)類型 外部變量表;(2)非靜態(tài)外部變量允許被其它源文件中的函數(shù)引用定義時(shí)缺省static關(guān)鍵字的外部變量,即為非靜態(tài)外部變量。其它源文件中的函數(shù),引用非靜態(tài)外部變量時(shí),需要在引用函數(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)存儲(chǔ)方式,但兩者區(qū)別較大:(1)定義的位置不同。靜態(tài)局部變量在函數(shù)內(nèi)定義,靜態(tài)外部變量在函數(shù)外定義。(2)作用域不同。靜態(tài)局部變量屬于內(nèi)部變量,其作用域僅限于定義它的函數(shù)內(nèi);雖然生存期為
34、整個(gè)源程序,但其它函數(shù)是不能使用它的。 靜態(tài)外部變量在函數(shù)外定義,其作用域?yàn)槎x它的源文件內(nèi);生存期為整個(gè)源程序,但其它源文件中的函數(shù)也是不能使用它的。(3)初始化處理不同。靜態(tài)局部變量,僅在第1次調(diào)用它所在的函數(shù)時(shí)被初始化,當(dāng)再次調(diào)用定義它的函數(shù)時(shí),不再初始化,而是保留上1次調(diào)用結(jié)束時(shí)的值。而靜態(tài)外部變量是在函數(shù)外定義的,不存在靜態(tài)內(nèi)部變量的“重復(fù)”初始化問題,其當(dāng)前值由最近1次給它賦值的操作決定。存儲(chǔ)類別總結(jié) 見表函數(shù)內(nèi)函數(shù)外作用域存在性作用域存在性 auto register static 局部 static 全部 本文件 不加 static 全局(外部) 務(wù)必牢記:把局部變量改變?yōu)殪o態(tài)
35、內(nèi)部變量后,改變了它的存儲(chǔ)方式,即改變了它的生存期。把外部變量改變?yōu)殪o態(tài)外部變量后,改變了它的作用域,限制了它的使用范圍。因此,關(guān)鍵字“static”在不同的地方所起的作用是不同的。8.10 內(nèi)部函數(shù)和外部函數(shù) 當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),語言根據(jù)函數(shù)能否被其它源文件中的函數(shù)調(diào)用,將函數(shù)分為內(nèi)部函數(shù)和外部函數(shù)。8.10.1 內(nèi)部函數(shù)(又稱靜態(tài)函數(shù))如果在一個(gè)源文件中定義的函數(shù),只能被本文件中的函數(shù)調(diào)用,而不能被同一程序其它文件中的函數(shù)調(diào)用,這種函數(shù)稱為內(nèi)部函數(shù)。定義一個(gè)內(nèi)部函數(shù),只需在函數(shù)類型前再加一個(gè)“static”關(guān)鍵字即可,如下所示:static 函數(shù)類型 函數(shù)名(函數(shù)參數(shù)表) 關(guān)鍵
36、字“static”,譯成中文就是“靜態(tài)的”,所以內(nèi)部函數(shù)又稱靜態(tài)函數(shù)。但此處“static”的含義不是指存儲(chǔ)方式,而是指對(duì)函數(shù)的作用域僅局限于本文件。使用內(nèi)部函數(shù)的好處是:不同的人編寫不同的函數(shù)時(shí),不用擔(dān)心自己定義的函數(shù),是否會(huì)與其它文件中的函數(shù)同名,因?yàn)橥矝]有關(guān)系。8.10.1 內(nèi)部函數(shù)如果在一個(gè)源文件中定義的函數(shù),只能被本文件中的函數(shù)調(diào)用,而不能被同一程序其它文件中的函數(shù)調(diào)用,這種函數(shù)稱為內(nèi)部函數(shù)。定義一個(gè)內(nèi)部函數(shù),只需在函數(shù)類型前再加一個(gè)“static”關(guān)鍵字即可,如下所示:static 函數(shù)類型 函數(shù)名(函數(shù)參數(shù)表) 關(guān)鍵字“static”,譯成中文就是“靜態(tài)的”,所以內(nèi)部函數(shù)又稱
37、靜態(tài)函數(shù)。但此處“static”的含義不是指存儲(chǔ)方式,而是指對(duì)函數(shù)的作用域僅局限于本文件。使用內(nèi)部函數(shù)的好處是:不同的人編寫不同的函數(shù)時(shí),不用擔(dān)心自己定義的函數(shù),是否會(huì)與其它文件中的函數(shù)同名,因?yàn)橥矝]有關(guān)系。8.10.2 外部函數(shù)外部函數(shù)的定義:在定義函數(shù)時(shí),如果沒有加關(guān)鍵字“static”,或冠以關(guān)鍵字“extern”,表示此函數(shù)是外部函數(shù):extern 函數(shù)類型 函數(shù)名(函數(shù)參數(shù)表) 調(diào)用外部函數(shù)時(shí),需要對(duì)其進(jìn)行說明:extern 函數(shù)類型 函數(shù)名(參數(shù)類型表),函數(shù)名2(參數(shù)類型表2); 例: 有一個(gè)字符串,內(nèi)有若干個(gè)字符,程序?qū)⒆址性撟址麆h除去。用外部函數(shù)實(shí)現(xiàn)。外部函數(shù)的應(yīng)用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度純凈水安全衛(wèi)生監(jiān)管服務(wù)合同4篇
- 2025年度牛羊養(yǎng)殖產(chǎn)業(yè)鏈品牌保護(hù)與維權(quán)合同3篇
- 2025年度木材運(yùn)輸途中貨物保險(xiǎn)合同4篇
- 2025年度生態(tài)農(nóng)業(yè)園區(qū)場(chǎng)地承包與產(chǎn)品銷售合同集錦4篇
- 2025版實(shí)木家俱定制合同家居美學(xué)定制服務(wù)承諾3篇
- 2025版快速簽訂無中介二手房交易合同范本3篇
- 2025年度股權(quán)代持協(xié)議書:家族企業(yè)傳承代持專項(xiàng)合同4篇
- 二零二四年度子女撫養(yǎng)權(quán)明確的無子女離婚協(xié)議書定制模板3篇
- 2025年度代駕服務(wù)市場(chǎng)拓展與品牌合作合同4篇
- 二零二五版體育賽事運(yùn)營管理服務(wù)合同集錦4篇
- 道路瀝青工程施工方案
- 《田口方法的導(dǎo)入》課件
- 內(nèi)陸?zhàn)B殖與水產(chǎn)品市場(chǎng)營銷策略考核試卷
- 票據(jù)業(yè)務(wù)居間合同模板
- 承包鋼板水泥庫合同范本(2篇)
- DLT 572-2021 電力變壓器運(yùn)行規(guī)程
- 公司沒繳社保勞動(dòng)仲裁申請(qǐng)書
- 損傷力學(xué)與斷裂分析
- 2024年縣鄉(xiāng)教師選調(diào)進(jìn)城考試《教育學(xué)》題庫及完整答案(考點(diǎn)梳理)
- 車借給別人免責(zé)協(xié)議書
- 應(yīng)急預(yù)案評(píng)分標(biāo)準(zhǔn)表
評(píng)論
0/150
提交評(píng)論