




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C語言程序設(shè)計(jì),主講人:杉杉 E-mail:,第八章 函數(shù),8.1 概述 8.2 函數(shù)定義和調(diào)用 8.3 函數(shù)的嵌套調(diào)用和遞歸調(diào)用 8.4 數(shù)組作為函數(shù)參數(shù) 8.5 局部變量和全局變量 8.6 內(nèi)部函數(shù)和外部函數(shù) 8.7 動(dòng)態(tài)存儲(chǔ)變量與靜態(tài)存儲(chǔ)變量 8.8 程序舉例,8.1 概述,函數(shù)分為:庫函數(shù)和用戶自定義函數(shù) C庫函數(shù)非常豐富,在調(diào)用庫函數(shù)時(shí),必須清楚: (1)函數(shù)的功能和名稱 (2)參數(shù)的個(gè)數(shù)和順序,每個(gè)參數(shù)的意義和類型 (3)函數(shù)值的意義和類型 (4)使用標(biāo)準(zhǔn)函數(shù)時(shí)需要使用包含文件,8.2 函數(shù)定義和調(diào)用,8.2.1 函數(shù)的定義 8.2.2 函數(shù)的返回值與函數(shù)類型 8.2.3 對被調(diào)用
2、函數(shù)的說明和函數(shù)原型 8.2.4 函數(shù)的調(diào)用 8.2.5 函數(shù)的形參與實(shí)參,8.2.1 函數(shù)的定義,根據(jù)函數(shù)是否需要參數(shù),可將函數(shù)分為無參函數(shù)和有參函數(shù)兩種。 1. 無參函數(shù)的一般形式 2. 有參函數(shù)的一般形式 3說明,1. 無參函數(shù)的一般形式,函數(shù)類型 函數(shù)名( ) 說明語句部分; 可執(zhí)行語句部分; ,2. 有參函數(shù)的一般形式,函數(shù)類型 函數(shù)名(數(shù)據(jù)類型 參數(shù),數(shù)據(jù)類型 參數(shù)2 ) 說明語句部分; 可執(zhí)行語句部分; ,【例8.1】 定義一個(gè)函數(shù),用于求兩個(gè)數(shù)的和。,/*功能:定義一個(gè)求兩個(gè)數(shù)的和的函數(shù)并在主函數(shù)中調(diào)用*/int sum(int n1, int n2) return (n1+n
3、2);main() int sum(int n1, int n2);/*函數(shù)說明*/ int num1,num2; printf(“input two numbers:n”); scanf(“%d%d”, return 語句后面的()可以不要,如return z;和return (z);等價(jià)。 (2)return語句的功能 返回調(diào)用函數(shù),并將“返回值表達(dá)式”的值帶給調(diào)用函數(shù)。 注意:調(diào)用函數(shù)中無return語句,并不是不返回一個(gè)值,而是一個(gè)不確定的值。為了明確表示不返回值,可以用“void”定義成“無(空)類型”。,2函數(shù)類型,在定義函數(shù)時(shí),對函數(shù)類型的說明,應(yīng)與return語句中返回值表達(dá)式
4、的類型一致。 如果不一致,則以函數(shù)類型為準(zhǔn)。 如果缺省函數(shù)類型,則系統(tǒng)一律按整型處理。 良好的程序設(shè)計(jì)習(xí)慣: 凡不要求返回值的函數(shù)都應(yīng)定義為空類型void; 即使函數(shù)類型為整型,也不使用系統(tǒng)的缺省處理。,8.2.3 對被調(diào)用函數(shù)的說明和函數(shù)原型,對被調(diào)用函數(shù)進(jìn)行聲明,其一般格式如下: 函數(shù)類型 函數(shù)名(數(shù)據(jù)類型 參數(shù)名1, 數(shù)據(jù)類型 參數(shù)名2); 語言規(guī)定在以下2種情況下,可以省去對被調(diào)用函數(shù)的說明: 當(dāng)被調(diào)用函數(shù)的函數(shù)定義出現(xiàn)在調(diào)用函數(shù)之前時(shí)。 如果在所有函數(shù)定義之前,在函數(shù)外部(例如文件開始處)預(yù)先對各個(gè)函數(shù)進(jìn)行了說明,則在調(diào)用函數(shù)中可缺省對被調(diào)用函數(shù)的說明。,【例8.2】對被調(diào)用函數(shù)作聲
5、明,#include void main() float add(float x, float y); /*對被調(diào)用函數(shù)add聲明*/ float a,b,c; scanf(%f,%f,注意:函數(shù)的定義和聲明的區(qū)別。,8.2.4 函數(shù)的調(diào)用,語言中,函數(shù)調(diào)用的一般形式為: 函數(shù)名(實(shí)際參數(shù)表) ; 如果調(diào)用無參函數(shù),則實(shí)際參數(shù)表可以沒有,但括號(hào)不能省。 切記:實(shí)參的個(gè)數(shù)、類型和順序,應(yīng)該與被調(diào)用函數(shù)所要求的參數(shù)個(gè)數(shù)、類型和順序一致,才能正確地進(jìn)行數(shù)據(jù)傳遞。,在語言中,可以用以下幾種方式調(diào)用函數(shù): (1)函數(shù)表達(dá)式。函數(shù)作為表達(dá)式的一項(xiàng),出現(xiàn)在表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)算。這種方式要求
6、函數(shù)有返回值。 如c=max(a,b)*20; (2)函數(shù)語句。C語言中的函數(shù)可以只進(jìn)行某些操作而不返回函數(shù)值,這時(shí)的函數(shù)調(diào)用可作為一條獨(dú)立的語句。 如:Print( ); (3)函數(shù)實(shí)參。函數(shù)作為另一個(gè)函數(shù)調(diào)用的實(shí)際參數(shù)出現(xiàn)。這種情況是把該函數(shù)的返回值作為實(shí)參進(jìn)行傳送,因此要求該函數(shù)必須有返回值。 如:d=max(a,max(b,c);,說明: (1)調(diào)用函數(shù)時(shí),函數(shù)名稱必須與具有該功能的自定義函數(shù)名稱完全一致。 (2)實(shí)參在類型上按順序與形參,必須一一對應(yīng)和匹配。如果類型不匹配,C編譯程序?qū)促x值兼容的規(guī)則進(jìn)行轉(zhuǎn)換。如果實(shí)參和形參的類型不賦值兼容,通常并不給出出錯(cuò)信息,且程序仍然繼續(xù)執(zhí)行,
7、只是有可能得不到正確的結(jié)果。 (3)如果實(shí)參表中包括多個(gè)參數(shù),對實(shí)參的求值順序隨系統(tǒng)而異。有的系統(tǒng)按自左向右順序求實(shí)參的值,有的系統(tǒng)則相反。Turbo C和MS C是按自右向左的順序進(jìn)行的 。,8.2.5 函數(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í)參的值傳送給被調(diào)用函數(shù)的形參,從而實(shí)現(xiàn)調(diào)用函數(shù)向被調(diào)用函數(shù)的數(shù)據(jù)傳送。,【例8.3】定義一個(gè)函數(shù)max,實(shí)現(xiàn)求用戶從終端輸入的2個(gè)整型數(shù)中的較大者.,#include stdio.h void main() int max(int x,int y);
8、int a,b,c; scanf(%d,%d,說明: 1:函數(shù)調(diào)用前形參不占用內(nèi)存中的存儲(chǔ)單元,只有在發(fā)生函數(shù)調(diào)用時(shí)形參才被分配內(nèi)存單元,在調(diào)用結(jié)束后,形參所占內(nèi)存單元被釋放。因此,形參只有在該函數(shù)內(nèi)有效。因此在執(zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參的值如果改變,并不會(huì)改變主調(diào)函數(shù)的實(shí)參的值。 2. 實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等。無論是何種類型,在進(jìn)行函數(shù)調(diào)用時(shí),都必須具有確定的值,以便把這些值傳送給形參。因此,應(yīng)預(yù)先用賦值、輸入等辦法,使實(shí)參獲得確定的值。 3. 實(shí)參對形參的數(shù)據(jù)傳送是單向的“值傳遞”,即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。,【例8.4】函數(shù)參數(shù)的傳遞,m
9、ain( ) int a=88,b=66; int swap(int ,int ); printf(“調(diào)用交換前:a=%d,b=%dn”,a,b); swap(a,b); printf(“調(diào)用交換后:a=%d,b=%dn”,a,b); int swap(int x,int y) int temp; printf(“調(diào)用中交換前:x=%d,y=%dn”,x,y); temp=x;x=y;y=temp; printf(“調(diào)用中交換后:x=%d,y=%dn”,x,y); ,8.3 函數(shù)的嵌套調(diào)用和遞歸調(diào)用,8.3.1 嵌套調(diào)用 8.3.2 遞歸調(diào)用,8.3.1 嵌套調(diào)用,函數(shù)的嵌套調(diào)用:在調(diào)用一個(gè)函
10、數(shù)的過程中,又調(diào)用另一個(gè)函數(shù)。 C語言允許嵌套調(diào)用,不允許嵌套定義。,【例8.5】 計(jì)算s=1k+2k+3k+Nk (N=5,K=4),#define K 4 #define N 5 long 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; for(i=1;i=n;i+) sum += f1(i, k); return sum; main() print
11、f(Sum of %d powers of integers from 1 to %d = ,K,N); printf(%dn,f2(N,K) ); ,8.3.2 遞歸調(diào)用,在調(diào)用一個(gè)函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。 在遞歸調(diào)用中,調(diào)用函數(shù)又是被調(diào)用函數(shù),執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身。 為了防止遞歸調(diào)用無終止地進(jìn)行,必須在函數(shù)內(nèi)有終止遞歸調(diào)用的手段。常用的辦法是加條件判斷,滿足某種條件后就不再作遞歸調(diào)用,然后逐層返回。,舉一個(gè)例子,有甲乙丙丁4人,甲比乙大3歲,乙比丙大3歲,丙比丁大3歲,若知道丁為20歲,問甲為多大? 遞歸調(diào)用有兩個(gè)過程 遞歸過程,即自身不斷
12、調(diào)用自己,直至滿足某種條件出現(xiàn)確定值,終止遞歸; 遞推過程,由后及前,逐步返回,直到得到最初的返回值,即為所求。,【例8.6】有甲乙丙丁4人,甲比乙大3歲,乙比丙大3歲,丙比丁大3歲,若知道丁為20歲,問甲為多大?,int age(int n) int c; if(n=1) c=20; else c=age(n-1)+3; return(c); #include void main() printf(%d,age(4); ,【例8.7】用遞歸的方法求n! 1 (n=0,1) n!= n*(n-1)! (n1),float fac(int n) float f; if(n0) printf(n0
13、,dataerror!); else if(n=0 | n=1) f=1; else return(f); ,f=fac(n-1)*n;,【例8.8】用遞歸的方法求漢諾塔問題。,#include void main() void hanoi(int n,char one,char two,char three); int m; printf(input the number of diskes:); scanf(%d, ,void hanoi(int n,char one,char two,char three) void move(char x,char y); void move(char
14、 x,char y) printf(%c-%cn,x,y); ,if(n=1) move(one,three); else hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three);,8.4 數(shù)組作為函數(shù)參數(shù),8.4.1 數(shù)組元素作為函數(shù)參數(shù) 8.4.2 數(shù)組名作為函數(shù)參數(shù),【例8.9】有兩個(gè)數(shù)組a,b,逐個(gè)比較數(shù)組中對應(yīng)元素的大小。分別統(tǒng)計(jì)a數(shù)組中元素大于、小于、等于b數(shù)組中元素的次數(shù),#include void main() int large(int x,int y); int a10,b10,i,n=0,m=
15、0,k=0; for(i=0;ibi:%d timesnai=bi:%d timesnaibi:%d timesn,n,m,k);,large(int x,int y) int flag; if(xy)flag=1; else if(x=y)flag=0; else flag=-1; return(flag); ,【例8.10】 寫一函數(shù),統(tǒng)計(jì)字符串中字母的個(gè)數(shù)。,int isalp(char c) if (c=a ,for(i=0;stri!=0;i+) if (isalp(stri) num+;,說明: (1)用數(shù)組元素作實(shí)參時(shí),只要數(shù)組類型和函數(shù)的形參類型一致即可,并不要求函數(shù)的形參也是
16、下標(biāo)變量。換句話說,對數(shù)組元素的處理是按普通變量對待的。 (2)在普通變量或下標(biāo)變量作函數(shù)參數(shù)時(shí),形參變量和實(shí)參變量是由編譯系統(tǒng)分配的兩個(gè)不同的內(nèi)存單元。在函數(shù)調(diào)用時(shí)發(fā)生的值傳送,是把實(shí)參變量的值賦予形參變量。,8.4.2 數(shù)組名作為函數(shù)參數(shù),數(shù)組名作函數(shù)參數(shù)時(shí),既可以作形參,也可以作實(shí)參。要求形參和相對應(yīng)的實(shí)參必須是類型相同的數(shù)組(或指向數(shù)組的指針變量),都必須有明確的數(shù)組說明。,【例8.11】 已知某個(gè)學(xué)生5門課程的成績,求平均成績。,float aver( float a 5 ) /*求平均值函數(shù)*/ int i; float av,s=a0; for(i=1;i5;i+) s += a
17、i; av=s/5; return av; void main() float score5,av; int i; printf(ninput 5 scores:n); for(i=0;i5;i+) scanf(%f, ,說明: (1)用數(shù)組名作函數(shù)參數(shù),應(yīng)該在調(diào)用函數(shù)和被調(diào)用函數(shù)中分別定義數(shù)組,且數(shù)據(jù)類型必須一致,否則結(jié)果將出錯(cuò)。 (2)C編譯系統(tǒng)對形參數(shù)組大小不作檢查,只是將實(shí)參數(shù)組的地址傳遞給形參數(shù)組,所以形參數(shù)組可以不指定大小。如果指定形參數(shù)組的大小,則實(shí)參數(shù)組的大小必須大于等于形參數(shù)組,否則因形參數(shù)組的部分元素沒有確定值而導(dǎo)致計(jì)算結(jié)果錯(cuò)誤。 (3)數(shù)組名作為函數(shù)參數(shù)時(shí),傳遞的是數(shù)組地
18、址,這樣形參和實(shí)參就共用一個(gè)內(nèi)存空間。也就是說形參數(shù)組中各元素的值發(fā)生變化也將使得實(shí)參數(shù)組的值發(fā)生變化。,【例8.12】用選擇法對數(shù)組中10個(gè)整數(shù)由小到大排序。,#include void main() void sort(int array,int n); int a10,i; printf(enter the arrayn); for(i=0;i10;i+) scanf(%d, ,void sort(int array ,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; t=ar
19、rayk; arrayk=arrayi; arrayi=t; ,8.5 局部變量和全局變量,8.5.1 局部變量 8.5.2 全局變量,8.5.1 局部變量,在一個(gè)函數(shù)內(nèi)部說明的變量是內(nèi)部變量,它只在該函數(shù)范圍內(nèi)有效。也就是說,只有在包含變量說明的函數(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,
20、n; /*m,n作用域僅限于函數(shù)main()中*/,關(guān)于局部變量的作用域還要說明以下幾點(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īng)予以注意。 2形參變量也是內(nèi)部變量,屬于被調(diào)用函數(shù);實(shí)參變量,則是調(diào)用函數(shù)的內(nèi)部變量。 3允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對象,分配不同的單元,互不干擾,也不會(huì)發(fā)生混淆。 4在復(fù)合語句中也可定義變量,其作用域只在復(fù)合語句范圍內(nèi)。,【例8.13】在復(fù)合語句中定義變量。,#include s
21、tdio.h void main() int a,b; b=10; for(a=5;ab;a+) int i=0; i+=b; printf(%d,i); ,/*該程序運(yùn)行報(bào)錯(cuò)*/ /*undefined symbol i*/,/*i的作用范圍在這個(gè)for循環(huán)中*/,8.5.2 全局變量,在函數(shù)外部定義的變量稱為外部變量。以此類推,在函數(shù)外部定義的數(shù)組就稱為外部數(shù)組。 外部變量不屬于任何一個(gè)函數(shù),其作用域是:從外部變量的定義位置開始,到本文件結(jié)束為止。 外部變量可被作用域內(nèi)的所有函數(shù)直接引用,所以外部變量又稱全局變量。,【例814】輸入長方體的長(l)、寬(w)、高(h),求長方體體積及正、側(cè)
22、、頂三個(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; printf(ninput length,width and height: ); scanf(%d%d%d, ,對于全局變量還有以下幾點(diǎn)說明: (1)外部變量可加強(qiáng)函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,但又使這些函數(shù)依賴這些外部變量,因而使得這些函數(shù)的獨(dú)立性降低。從模塊化程序設(shè)計(jì)的觀點(diǎn)來看這是不利的,因此不是非用不可時(shí),不要使用外部變量。 (2)在同一源文件中,允許外部
23、變量和內(nèi)部變量同名。在內(nèi)部變量的作用域內(nèi),外部變量將被屏蔽而不起作用。 (3)外部變量的作用域是從定義點(diǎn)到本文件結(jié)束。如果定義點(diǎn)之前的函數(shù)需要引用這些外部變量時(shí),需要在函數(shù)內(nèi)對被引用的外部變量進(jìn)行說明。外部變量說明的一般形式為: extern 數(shù)據(jù)類型 外部變量,外部變量2; 注意:外部變量的定義和外部變量的說明是兩回事。外部變量的定義,必須在所有的函數(shù)之外,且只能定義一次。而外部變量的說明,出現(xiàn)在要使用該外部變量的函數(shù)內(nèi),而且可以出現(xiàn)多次。,【例8.15】局部變量和全局變量同名,#include int a=3,b=5; max(int a,int b) int c; c=ab?a:b; r
24、eturn(c); main() int a=8; printf(%dn,max(a,b); ,【例8.16】外部變量的定義與說明,int vs(int xl,int xw) extern int xh; int v; v=xl*xw*xh; return v; main() extern int xw,xh; int xl=5; printf(xl=%d,xw=%d,xh=%dnv=%d,xl,xw,xh,vs(xl,xw); int xl=3,xw=4,xh=5;,/*外部變量xl,xw,xh的定義*/,/*外部變量xw,xh的聲明*/,/*外部變量xh的聲明*/,8.6 內(nèi)部函數(shù)和外部函
25、數(shù),8.6.1 內(nèi)部函數(shù)(又稱靜態(tài)函數(shù)) 8.6.2 外部函數(shù),8.6.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ù)表) 使用內(nèi)部函數(shù)的好處是:不同的人編寫不同的函數(shù)時(shí),不用擔(dān)心自己定義的函數(shù),是否會(huì)與其它文件中的函數(shù)同名,因?yàn)橥矝]有關(guān)系。 注意:此處“static”的含義不是指存儲(chǔ)方式,而是指對函數(shù)的作用域僅局限于本文件。,8.6.2 外部函數(shù),外部函數(shù)的定義:在定
26、義函數(shù)時(shí),如果沒有加關(guān)鍵字“static”,或冠以關(guān)鍵字“extern”,表示此函數(shù)是外部函數(shù): extern 函數(shù)類型 函數(shù)名(函數(shù)參數(shù)表) 注意:調(diào)用外部函數(shù)時(shí),需要對其進(jìn)行聲明: extern 函數(shù)類型 函數(shù)名(參數(shù)類型表),函數(shù)名2(參數(shù)類型表2);,【例8.17】 外部函數(shù)應(yīng)用,(1)文件mainf.c main() extern void input(),process(),output(); input(); process(); output(); (2)文件subf1.c extern void input()/*定義外部函數(shù)*/ (3)文件subf2.c extern vo
27、id process()/*定義外部函數(shù)*/ (4)文件subf3.c extern void output()/*定義外部函數(shù)*/ ,8.7 動(dòng)態(tài)存儲(chǔ)變量與靜態(tài)存儲(chǔ)變量,在語言中,對變量和函數(shù)有兩個(gè)屬性:數(shù)據(jù)類型和存儲(chǔ)類型。 存儲(chǔ)類型指數(shù)據(jù)在內(nèi)存中存儲(chǔ)的方式,有以下四種:自動(dòng)變量(auto)、寄存器變量(register)、外部變量(extern)、靜態(tài)變量(static)。自動(dòng)變量和寄存器變量屬于動(dòng)態(tài)存儲(chǔ)方式,外部變量和靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ)方式。 靜態(tài)存儲(chǔ)方式在程序運(yùn)行期間由系統(tǒng)分配固定的存儲(chǔ)空間,而動(dòng)態(tài)存儲(chǔ)方式在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)方式。,8.7.1 內(nèi)部變量的存儲(chǔ)
28、方式 8.7.2 外部變量的存儲(chǔ)方式 8.7.3 靜態(tài)局部變量和靜態(tài)外部變量的比較,8.7.1 內(nèi)部變量的存儲(chǔ)方式,1靜態(tài)存儲(chǔ)靜態(tài)內(nèi)部變量 2動(dòng)態(tài)存儲(chǔ)自動(dòng)局部變量(又稱自動(dòng)變量) 3寄存器存儲(chǔ)寄存器變量,1靜態(tài)存儲(chǔ)靜態(tài)內(nèi)部變量,(1)定義格式 static 數(shù)據(jù)類型 內(nèi)部變量表; (2)存儲(chǔ)特點(diǎn) (a) 靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ)。在程序執(zhí)行過程中,即使所在函數(shù)調(diào)用結(jié)束也不釋放。換句話說,在程序執(zhí)行期間,靜態(tài)內(nèi)部變量始終存在,但其它函數(shù)是不能引用它們的。 (b) 定義但不初始化,則自動(dòng)賦以(整型和實(shí)型)或0(字符型);且每次調(diào)用它們所在的函數(shù)時(shí),不再重新賦初值,只是保留上次調(diào)用結(jié)束時(shí)的值! (3
29、)何時(shí)使用靜態(tài)內(nèi)部變量 (a) 需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值。 (b) 變量只被引用而不改變其值。,2動(dòng)態(tài)存儲(chǔ)自動(dòng)局部變量(又稱自動(dòng)變量),(1)定義格式 auto 數(shù)據(jù)類型 變量表; (2)存儲(chǔ)特點(diǎn) (a) 自動(dòng)變量屬于動(dòng)態(tài)存儲(chǔ)方式。在函數(shù)中定義的自動(dòng)變量,只在該函數(shù)內(nèi)有效;函數(shù)被調(diào)用時(shí)分配存儲(chǔ)空間,調(diào)用結(jié)束就釋放。 (b) 定義而不初始化,則其值是不確定的。如果初始化,則賦初值操作在調(diào)用時(shí)進(jìn)行,且每次調(diào)用都要重新賦一次初值。 (c) 由于自動(dòng)變量的作用域和生存期,都局限于定義它的個(gè)體內(nèi)(函數(shù)或復(fù)合語句),因此不同的個(gè)體中允許使用同名的變量而不會(huì)混淆。即使在函數(shù)內(nèi)定義的自動(dòng)變量,也可與該
30、函數(shù)內(nèi)部的復(fù)合語句中定義的自動(dòng)變量同名。 注意:系統(tǒng)不會(huì)混淆,并不意味著人也不會(huì)混淆,所以盡量少用同名自動(dòng)變量!,【例8.18】自動(dòng)變量與靜態(tài)局部變量的存儲(chǔ)特性。,void auto_static() int var_auto=0; static int var_static=0; printf(%d,%dn, var_auto, var_static); +var_auto; +var_static; main() int i; for(i=0; i5; i+) auto_static(); ,運(yùn)行輸出: 0,0 0,1 0,2 0,3 0,4,/*自動(dòng)變量:每次調(diào)用都重新初始化*/ /*靜態(tài)局部變量:只初始化1次*/,【例8.19】輸出1到5的階乘值。,#include void main() int fac(int n); int i; for(i=1;i=5;i+) printf(%d!=%dn,i,fac(i); int fac(int n) static int f=1; f=f*n; return(f); ,3寄存器存儲(chǔ)寄存器變量,一般情況下,變量的值都是存儲(chǔ)在內(nèi)存中的。為提高執(zhí)行效率,語言允許將局部變量的值存放到寄存器中,這種變量就稱為寄存器變量。定義格式如下:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- YY/T 1860.1-2024無源外科植入物植入物涂層第1部分:通用要求
- 購房補(bǔ)充合同范本
- 城市垃圾處理站承包合同協(xié)議書
- 股權(quán)合伙合同協(xié)議
- 單位實(shí)習(xí)生勞動(dòng)合同范本
- 簡易短期借款合同文本
- 度工業(yè)用地使用權(quán)轉(zhuǎn)讓合同書
- 農(nóng)業(yè)技術(shù)合作協(xié)議合同范本
- 軟件租賃與服務(wù)合同
- 校園欺凌心理安全課件
- 《小兒過敏性紫癜》課件
- 醫(yī)療器械生產(chǎn)中的人工智能應(yīng)用技巧
- 回奶介紹演示培訓(xùn)課件
- 2024年福建福州地鐵集團(tuán)招聘筆試參考題庫含答案解析
- 綠色施工環(huán)境保護(hù)應(yīng)急預(yù)案
- 2023靜脈治療護(hù)理技術(shù)操作標(biāo)準(zhǔn)解讀
- 基礎(chǔ)日語1學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫2023年
- 客源國概況-韓國課件
- 保密風(fēng)險(xiǎn)評(píng)估報(bào)告
- 道路建筑材料電子教案(全)
- 《尹定邦設(shè)計(jì)學(xué)概論》試題及答案
評(píng)論
0/150
提交評(píng)論