版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第6章 函 數(shù)第1頁(yè)第1頁(yè)概 述 C語(yǔ)言是由函數(shù)構(gòu)成。通過(guò)函數(shù)定義把實(shí)現(xiàn)細(xì)節(jié)封閉起來(lái),通過(guò)函數(shù)調(diào)用組合各種功效,就象用一個(gè)個(gè)構(gòu)件蓋房子似。 本章簡(jiǎn)介C語(yǔ)言中函數(shù)定義、函數(shù)調(diào)用、函數(shù)間數(shù)據(jù)傳遞問(wèn)題以及變量存儲(chǔ)類別、作用域和生存期。第2頁(yè)第2頁(yè)考核內(nèi)容 1. 函數(shù)定義辦法。 2. 函數(shù)類型和返回值。 3. 形式參數(shù)與實(shí)際參數(shù),參數(shù)值傳遞。 4. 函數(shù)正確調(diào)用,嵌套調(diào)用,遞歸調(diào)用。 5. 局部變量和全局變量。 6. 變量存儲(chǔ)類別、變量作用域和生存期。 7. 內(nèi)部函數(shù)與外部函數(shù)。 第3頁(yè)第3頁(yè)序言 6.1 C語(yǔ)言程序結(jié)構(gòu) C程序程序文獻(xiàn)1函數(shù)11函數(shù)12函數(shù)1n程序文獻(xiàn)m函數(shù)m1函數(shù)m2函數(shù)mn程序文
2、獻(xiàn)2函數(shù)21函數(shù)22函數(shù)2n第4頁(yè)第4頁(yè) 闡明: 1. 函數(shù)類型和返回值。 2. 任何一個(gè)C程序可由多個(gè)源程序文獻(xiàn)( .C)構(gòu)成。每個(gè)源程序文獻(xiàn)( .C)由多個(gè)函數(shù)構(gòu)成。 3. 任何一個(gè)C 程序且必須有且只能有一個(gè)main函數(shù)。C 程序執(zhí)行都是從 main 函數(shù)開(kāi)始,調(diào)用其它函數(shù)后流程回到mian函數(shù),在main函數(shù)中結(jié)束。 4.當(dāng)main函數(shù)調(diào)用其它函數(shù)時(shí),我們稱main函數(shù)為主調(diào)函數(shù),而稱其它函數(shù)為被調(diào)函數(shù)。當(dāng)其它函數(shù)調(diào)用另外一些函數(shù)時(shí),它們又成為主調(diào)函數(shù)。第5頁(yè)第5頁(yè) 說(shuō)明: 5. C語(yǔ)言中使用函數(shù)種類有各種,我們可以從不同角度來(lái)了解。函數(shù)從用戶角度分為:標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù))用戶自定義函數(shù)
3、函數(shù)從形式上分為: 無(wú)參函數(shù) 有參函數(shù)第6頁(yè)第6頁(yè)例6-1 函數(shù)舉例#include func1( ) /*fun1函數(shù)定義*/printf (*n);printf (THIS IS A C FUNCTION EXAMPLE! n);printf (*n);main( ) func1( ); /*main函數(shù)調(diào)用fun1函數(shù)*/程序運(yùn)營(yíng)結(jié)果下列:*THIS IS A C FUNCTION EXAMPLE!*第7頁(yè)第7頁(yè)普通格式類型標(biāo)識(shí)符 函數(shù)名(形參類型闡明表)申明語(yǔ)句執(zhí)行語(yǔ)句例 有參函數(shù) int max(int x,int y) int z; z=xy?x:y; return(z); 例 有
4、參函數(shù)不能下列定義 int max(int x, y) int z; z=xy?x:y; return(z); 例 空函數(shù) dummy( ) 6.2 函數(shù)定義普通形式 例 無(wú)參函數(shù)fun1( ) printf(“*n”); 或int fun1() printf(“*n”); 函數(shù)返回值類型缺省int型無(wú)返回值void合法標(biāo)識(shí)符用于指出每個(gè)形參類型、名稱。注意,即使沒(méi)有形參,()也不能省函數(shù)體函數(shù)體為空第8頁(yè)第8頁(yè)例6-2 定義一個(gè)函數(shù),用于求兩個(gè)數(shù)相乘結(jié)果 main()float mul(float x,float y); /*mul函數(shù)申明*/ float a,b,c; scanf(“%f,
5、%f”,&a,&b); c=mul(a,b); /*調(diào)用mul函數(shù)求兩數(shù)相乘結(jié)果*/ printf(“The result is %f”,c); float mul(float x,float y) /*mul函數(shù)以及形參定義*/float z; z=x*y; return(z); /*返回函數(shù)值語(yǔ)句*/程序運(yùn)營(yíng)結(jié)果下列: 2.1,3.4The result is 7.140000 第9頁(yè)第9頁(yè)c=mul(a,b);(main 函數(shù))(mul 函數(shù))float mul(float x,float y) float z; z=x*y; return(z);例6-2 程序執(zhí)行過(guò)程 第10頁(yè)第10頁(yè)
6、 函數(shù)間數(shù)據(jù)傳遞方式有三種: 1. 參數(shù)傳遞(值傳遞和地址傳遞) 利用實(shí)參和形參實(shí)現(xiàn)(實(shí)參形參)2. 函數(shù)返回值 利用return語(yǔ)句實(shí)現(xiàn)(形參實(shí)參)3. 全局變量6.3 函數(shù)之間數(shù)據(jù)傳遞 第11頁(yè)第11頁(yè) 1. 形參與實(shí)參 形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中變量名。 形參出現(xiàn)在被調(diào)函數(shù)定義中。 實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中表示式。實(shí)參出現(xiàn)在主調(diào)函數(shù)調(diào)用被調(diào)函數(shù)語(yǔ)句中。6.3.1 函數(shù)參數(shù)實(shí)參與形參 2.實(shí)參-形參傳遞數(shù)據(jù)方式 值傳遞含義: 在調(diào)用函數(shù)時(shí),主調(diào)函數(shù)把實(shí)參變量值復(fù)制給被調(diào)函數(shù)形參,在函數(shù)內(nèi)部則使用形參中值進(jìn)行處理。 值傳遞方式: 數(shù)據(jù)復(fù)制 地址復(fù)制 第12頁(yè)第12頁(yè)例6
7、-3 求三個(gè)數(shù)平均值 float aver(float f1,float f2,float f3)float z; z=(f1+f2+f3)/3; return(z);main()float a,b,c,average; printf(please enter a,b,c:n); scanf(%f,%f,%fn,&a,&b,&c); average=aver(a,b,c); printf(average=%fn,average);程序運(yùn)營(yíng)結(jié)果下列:please enter a,b,c:4.0,8.0,5.0average =5.666667 值傳遞方式一: 數(shù)據(jù)復(fù)制值傳遞(數(shù)據(jù)復(fù)制)第13頁(yè)第
8、13頁(yè)例6-4編寫(xiě)一個(gè)函數(shù)互換主函數(shù)中兩個(gè)變量值 swap(int a,int b)int temp; temp=a; a=b; b=temp; printf(“n a=%d b=%dn”,x,y); main()int x,y;printf(“please enter x and y: ”);scanf(“%d %d”,&x,&y);printf(“n x=%d y=%d”,a,b);printf(“n-do swap -”);swap(x,y);printf(“n x=%d y=%d”,x,y); .200A5變量a 變量b(main)855858數(shù)據(jù)復(fù)制 變量temp 變量y 變量x(s
9、wap)值傳遞(數(shù)據(jù)復(fù)制)程序運(yùn)營(yíng)結(jié)果下列:please enter x and y: 5 8x=5 y=8-do swap-a=8 b=5x=5 y=8第14頁(yè)第14頁(yè)例6-5求一維數(shù)組中各元素之和 main()int i,a10; float mv; float sub(); for(i=0;i10;i+) scanf(%d,&ai); mv=sub(a); printf(SUB=%fn,mv);float sub(int d10) float sum; int i; for(sum=0,i=0;i10;i+) sum+=di; return sum;值傳遞( 地址復(fù)制)值傳遞方式二: 地
10、址復(fù)制1424681012161820200A200C200Ead程序運(yùn)營(yíng)結(jié)果下列:2 4 6 8 10 12 14 16 18 20SUB=110.000000 第15頁(yè)第15頁(yè) 注意:6.3.1 函數(shù)參數(shù)實(shí)參與形參1.數(shù)組名代表數(shù)組首地址。 2.地址傳遞方式是通過(guò)將實(shí)參存儲(chǔ)地址值傳給形參來(lái)實(shí)現(xiàn)數(shù)據(jù)傳送。其實(shí)質(zhì)是讓形參和實(shí)參使用相同存儲(chǔ)空間。 第16頁(yè)第16頁(yè)函數(shù)參數(shù)小結(jié): 6.3.1 函數(shù)參數(shù)實(shí)參與形參 1.形參在被調(diào)函數(shù)中定義,實(shí)參在主調(diào)函數(shù)中定義。 2.形參定義時(shí)編譯系統(tǒng)并不為其分派存儲(chǔ)空間,也無(wú)初值,只有在函數(shù)調(diào)用時(shí),暫時(shí)分派存儲(chǔ)空間,接受來(lái)自實(shí)參值,函數(shù)調(diào)用結(jié)束,形參所占用內(nèi)存空間
11、釋放,值消失。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。第17頁(yè)第17頁(yè)函數(shù)參數(shù)小結(jié): 6.3.1 函數(shù)參數(shù)實(shí)參與形參 3.實(shí)參能夠是常量、變量、表示式、函數(shù)、數(shù)組、指針等,無(wú)論實(shí)參是何種類型量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須含有擬定值,以便把這些值傳送給形參。 4.實(shí)參和形參在數(shù)量、類型、順序上應(yīng)一致,不然會(huì)發(fā)生“類型不匹配”錯(cuò)誤。 5.函數(shù)調(diào)用中發(fā)生數(shù)據(jù)傳送是單向。 (實(shí)參形參)第18頁(yè)第18頁(yè) 返回語(yǔ)句:形式: return(表示式)。功效:使程序控制從被調(diào)函數(shù)返回到主調(diào)函數(shù)中, 同時(shí)把被調(diào)函數(shù)返回值帶給主調(diào)函數(shù)。6.3.2 函數(shù)返回值表示式能夠是常量
12、、變量、函數(shù)、數(shù)組元素、地址常量和其它形式表示式等。第19頁(yè)第19頁(yè)例6-6計(jì)算分段函數(shù)值 #include float sub2(float a)float b; if(a=0&a1) b=a+1; else if(a2) b=2*a+5; else b=0; return(b);main()float x,y;printf(enter x:);scanf(%f,&x);y=sub2(x);printf(x=%f,y=%f,x,y);程序運(yùn)營(yíng)結(jié)果下列: enter x: 1.5 x=1.500000,y=8.000000 第20頁(yè)第20頁(yè) 闡明: 1. return 語(yǔ)句將被調(diào)用函數(shù)中一個(gè)擬
13、定值帶回主調(diào)函數(shù)中去,且一個(gè)return 語(yǔ)句只能帶回一個(gè)返回值。 2.一個(gè)函數(shù)體內(nèi)能夠有多個(gè)返回語(yǔ)句, 無(wú)論執(zhí)行到哪一個(gè),函數(shù)都結(jié)束,回到主調(diào)函數(shù)。 3.return后面括號(hào)內(nèi)若是一個(gè)常量或變量,則能夠省略() 4.在定義函數(shù)時(shí)應(yīng)當(dāng)指定函數(shù)返回值類型(簡(jiǎn)稱函數(shù)類型),return語(yǔ)句中表示式類型應(yīng)與定義函數(shù)時(shí)所指定函數(shù)類型一致。 return 0; 等價(jià)于 return (0); #include float sub2(float a)float b; if(a=0&a1) return(a+1); else if(a2) return(2*a+5); else return 0;main(
14、)float x,y; printf(enter x:); scanf(%f,&x); y=sub2(x); printf(x=%f,y=%f,x,y);6.3.2 函數(shù)返回值/*例6-7 求兩數(shù)中最大值 */#include max ( float x, float y )float z; z = xy ? x : y; return(z);main( )float a,b; int c; scanf (%f%f, &a, &b); c = max(a,b); printf (MAX is %dn, c);程序運(yùn)營(yíng)結(jié)果下列:4.5 6.8MAX is 6第21頁(yè)第21頁(yè) 闡明: 1.假如函數(shù)
15、類型和return語(yǔ)句中表示式值類型不一致,則以函數(shù)類型為準(zhǔn),自動(dòng)進(jìn)行類型轉(zhuǎn)換。 2.不帶返回值函數(shù),能夠明擬定義為“空類型”,類型闡明符為“void” 6.3.2 函數(shù)返回值第22頁(yè)第22頁(yè)6.4.1 函數(shù)調(diào)用普通形式 6.4 函數(shù)調(diào)用 調(diào)用形式: 函數(shù)名(實(shí)參表); 闡明: 1.實(shí)參表中實(shí)參個(gè)數(shù)、實(shí)參值類型以及出現(xiàn)順序應(yīng)與形參表實(shí)際情況相匹配。 2.假如被調(diào)用函數(shù)是無(wú)參函數(shù),則函數(shù)調(diào)用時(shí)也沒(méi)有實(shí)參,但函數(shù)名后面圓括號(hào)不能省略。 3.在函數(shù)調(diào)用中還應(yīng)當(dāng)注意一個(gè)問(wèn)題是求值順序問(wèn)題。 第23頁(yè)第23頁(yè)main()int i=8;printf(%d,%d,%d,%dn,+i,-i,i+,i-);例
16、6-8 參數(shù)求值順序從右到左求值運(yùn)營(yíng)結(jié)果:8,7,7,8 從左到右求值運(yùn)營(yíng)結(jié)果:9,8,8,9 第24頁(yè)第24頁(yè)函數(shù)表示式: 例 c=max(a,b);函數(shù)語(yǔ)句: 例 fun1();函數(shù)參數(shù): 例 printf(“%d”,max(a,b);6.4.2 函數(shù)調(diào)用方式第25頁(yè)第25頁(yè) 1.對(duì)被調(diào)用函數(shù)要求必須是已存在函數(shù)。庫(kù)函數(shù): stdio.h string.h math.h 。用戶自定義函數(shù): 在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)作申明。6.4.3 對(duì)被調(diào)用函數(shù)申明 2.函數(shù)申明普通形式1:函數(shù)類型 函數(shù)名(形參類型1,形參類型2,);普通形式2:函數(shù)類型 函數(shù)名(形參類型1 形參1,形參類型2 形參2,)
17、;第26頁(yè)第26頁(yè)main()long f (int n); /*對(duì)被調(diào)函數(shù)f申明*/ long sum; sum=1+f(2)+f(3)+f(4)+f(5); printf(“sum=%ldn”,sum);long f(int n) /*函數(shù)f 定義*/int i; long y=1; for(i=1;i=n;i+) y=y*i; return(y);例6-9 編程計(jì)算1!+2!+3!+4!+5! 程序運(yùn)營(yíng)情況下列: sum=153等價(jià)于: long f (int);第27頁(yè)第27頁(yè) 注意: 1.函數(shù)定義與函數(shù)申明不同函數(shù)申明位置:主調(diào)函數(shù)數(shù)聽(tīng)說(shuō)明部分 2.以下情況下,可不作函數(shù)說(shuō)明 (1)
18、若函數(shù)返值是char或int型,系統(tǒng)自動(dòng)按int型處理。 (2)被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前。 (3)假如在全部函數(shù)定義之前,在函數(shù)外預(yù)先說(shuō)明了各個(gè)函數(shù)類型,則在以后各主調(diào)函數(shù)中,可不再對(duì)被調(diào)函數(shù)作申明。 6.4.3 對(duì)被調(diào)用函數(shù)申明 第28頁(yè)第28頁(yè)對(duì)先引用后定義(位于主調(diào)函教之后)函數(shù)在引用前應(yīng)先申明。 注意: 3.下列情況下,可不作函數(shù)闡明 對(duì)庫(kù)函數(shù)調(diào)用不需要再作申明,但必須把包含該函數(shù)頭文獻(xiàn)用 include命令包括在源文獻(xiàn)前部。 6.4.3 對(duì)被調(diào)用函數(shù)申明 第29頁(yè)第29頁(yè)例 函數(shù)申明舉例float f(float b); /*函數(shù)f申明*/main() float f(flo
19、at b) /*函數(shù)f定義*/第30頁(yè)第30頁(yè)嵌套調(diào)用C要求:函數(shù)定義不可嵌套,但函數(shù)能夠嵌套調(diào)用6.5 函數(shù)嵌套調(diào)用void aia(),ber(),cal(); /*函數(shù)申明*/ main() printf(“I am in main.n”); aia(); void aia() printf(“Now I am in aia.n”); ber(); void ber()printf(“Now I am in ber.n”); cal(); void cal()printf(“Now I am in cal.n”); 程序運(yùn)營(yíng)情況下列: I am in main.Now I am in a
20、ia.Now I am in ber.Now I am in cal.第31頁(yè)第31頁(yè)例6-10 程序執(zhí)行過(guò)程。main函數(shù) 調(diào)用函數(shù)aia; 函數(shù) aia 調(diào)用函數(shù)ber; 函數(shù) cal 調(diào)用調(diào)用返回返回函數(shù) ber 調(diào)用函數(shù)cal; 調(diào)用返回第32頁(yè)第32頁(yè)例6-11 計(jì)算s=22!+32! long f1(int p)int k; long r; long f2(int); k=p*p; r=f2(k); return r;long f2(int q)long c=1; int i; for(i=1;i=q;i+) c=c*i; return c;main()int i; long s=
21、0; for (i=2;i1)1 (n=0,1)n!=float fac(int n)float f; if(n0) printf(“n n0,data error!”); f= -1; else if(n= =0 | n= =1) f=1; else f=fac(n-1)*n; return (f);main()int n; float y; printf(“input a integer number:”); scanf(“%d”,&n); y=fac(n); printf(“n %d! = %.2f”,n,y);程序運(yùn)營(yíng)結(jié)果下列:input a integer number: 4 4!
22、=24.00 第36頁(yè)第36頁(yè)例6-13 程序執(zhí)行過(guò)程主函數(shù) 第一次調(diào)用 第二次 第三次 第四次 n=4 y=fac(4); 調(diào)用 n=4 f=fac(3)*4; 調(diào)用 n=3 f=fac(2)*3; 調(diào)用 n=2 f=facto(1)*2; n=1 return(1); 返回 f=1*2 =2 return(2) 返回 f=2*3 =6 return(6) 返回 f=6*4 =24 return(24) 返回 y=24 遞歸返回過(guò)程遞歸調(diào)用過(guò)程float fac(int n)float f; if(n0) printf(“n n0) printf(%d ,c); else printf(%d
23、 ,0);main()int a5,i; printf(input 5 numbers:n); for(i=0;i5;i+) scanf(%d,&ai); ff(ai); 程序運(yùn)營(yíng)結(jié)果下列:input 5 numbers: 2 3 8 39 92 0 8 39 0 值傳遞(數(shù)據(jù)復(fù)制)形參:變量實(shí)參:數(shù)組元素第39頁(yè)第39頁(yè)例6-15 求數(shù)組中元素最大值。 main( )int max(int x,int y); int a10,b,i;printf(“input 10 numbers:”);for ( i=0; i10; i+ ) scanf (%d, &ai);b=0;for ( i=0;
24、iy ? x : y; return(z);程序運(yùn)營(yíng)結(jié)果下列: input 10 numbers:2 4 15 34 1 56 7 78 9 10 max is 78 值傳遞(數(shù)據(jù)復(fù)制)第一個(gè)實(shí)參:變量第二個(gè)實(shí)參:數(shù)組元素形參:變量第40頁(yè)第40頁(yè) 數(shù)組名作函數(shù)參數(shù)用兩種形式將數(shù)組名作為實(shí)參來(lái)調(diào)用函數(shù),而在被調(diào)函數(shù)定義中,用指針變量作形參來(lái)接受它 將數(shù)組名作為實(shí)參來(lái)調(diào)用函數(shù),而在被調(diào)用函數(shù)定義中,用數(shù)組名作形參來(lái)接受它。 注意: 用數(shù)組名作實(shí)參時(shí),并不是把數(shù)組中各元素值傳給形參,而是把數(shù)組首地址傳給形參,即地址傳遞方式。6.7.2 數(shù)組名作函數(shù)參數(shù) 第41頁(yè)第41頁(yè)例6-16 改用數(shù)組名作函數(shù)
25、參數(shù)。判別一個(gè)整數(shù)數(shù)組中各元素值,若不小于0則輸出該值,若小于等于0則輸出0。 void ff(int a5)int i; printf(nvalues of a :); for(i=0;i5;i+) if(ai0) ai=0; printf(%d ,ai); main()int b5,i; printf(ninput 5 numbers:); for(i=0;i5;i+) scanf(%d,&bi); printf(initial values of b : ); for(i=0;i5;i+) printf(%d ,bi); ff(b); printf(nlast values of b :
26、); for(i=0;i5;i+) printf(%d ,bi);值傳遞(地址傳遞)-24560910021008100A100410061000ba0程序運(yùn)營(yíng)結(jié)果下列:input 5 numbers:-2 4 56 9 0initial values of b:-2 4 56 9 0values of a:0 4 56 9 0last values of b:0 4 56 9 0形參:數(shù)組名實(shí)參:數(shù)組名第42頁(yè)第42頁(yè) 數(shù)組名作函數(shù)參數(shù)時(shí)注意用數(shù)組名作函數(shù)參數(shù),應(yīng)當(dāng)在主調(diào)函數(shù)和被調(diào)用函數(shù)分別定義實(shí)參和形參數(shù)組,不能只在一方定義。實(shí)參數(shù)組和形參數(shù)組必須類型相同,形參數(shù)組能夠不指明長(zhǎng)度。但為了在
27、被調(diào)用函數(shù)中處理數(shù)組元素需要,能夠另設(shè)一個(gè)參數(shù),傳遞數(shù)組元素個(gè)數(shù)。 6.7.2 數(shù)組名作函數(shù)參數(shù) void ff(int a5)int i; printf(nvalues of a :); for(i=0;i5;i+) if(ai0) ai=0; printf(%d ,ai); main( ). ff(b); .void ff(a,int n)for( i=0; in; i+ )ff( b,5 );第43頁(yè)第43頁(yè) 數(shù)組名作函數(shù)參數(shù)時(shí)注意 數(shù)組名作函數(shù)實(shí)參時(shí),不是把數(shù)組值傳遞給形參,而是把實(shí)參數(shù)組地址傳遞給形參數(shù)組,這樣兩個(gè)數(shù)組就同占一段內(nèi)存單元。利用這一點(diǎn)能夠?qū)崿F(xiàn)被調(diào)函數(shù)通過(guò)修改形參數(shù)組值來(lái)
28、達(dá)到改變主調(diào)函數(shù)中實(shí)參數(shù)組值目的。6.7.2 數(shù)組名作函數(shù)參數(shù) 第44頁(yè)第44頁(yè) 多維數(shù)組也能夠作函數(shù)參數(shù),但需注意:在函數(shù)定義時(shí)對(duì)形參數(shù)組能夠指定每一維長(zhǎng)度,也可省去第一維長(zhǎng)度,但不能省略第二維長(zhǎng)度。6.7.2 數(shù)組名作函數(shù)參數(shù) 形參數(shù)組第一維大小能夠是任意。 int array(int a310);int array(int a 10);int array(int a3 );int array(int a );第45頁(yè)第45頁(yè)例6-18 求34矩陣中值最大那個(gè)元素,以及該元素所在行號(hào)和列號(hào)。 max_v (int array4)int i,j,max,r,c; max=array00; f
29、or(i=0;i3;i+) for(j=0;jmax) max=arrayij; r=i;c=j;printf(“max is located :”);printf(“%d row ,%d column”,r,c);return(max);main()int a34,i,j,c; for(i=0;i3;i+) for(j=0;j4;j+) scanf(“%d”,&aij); c= max_v(a); printf(“the max number is %dn”,c); 值傳遞(地址傳遞)程序運(yùn)營(yíng)結(jié)果下列:2 3 5 68 4 3 2921 6 4 10max is located :1 row
30、 ,3 columthe max number is 29 形參:二維數(shù)組,省略了第一維長(zhǎng)度注意:第二維長(zhǎng)度不能省略,且應(yīng)與實(shí)參數(shù)組第一維長(zhǎng)度相等實(shí)參:二維數(shù)組第46頁(yè)第46頁(yè) 數(shù)組名作函數(shù)參數(shù)小結(jié): 1.用數(shù)組元素作實(shí)參時(shí),只要求實(shí)參數(shù)組元素類型和函數(shù)形參變量類型一致,形參并不要求也是數(shù)組元素。用數(shù)組名作函數(shù)參數(shù)時(shí),則要求實(shí)參和相相應(yīng)形參都必須是類型相同數(shù)組,都必須有明確數(shù)組定義,當(dāng)形參和實(shí)參兩者不一致時(shí),就會(huì)發(fā)生錯(cuò)誤。6.7.2 數(shù)組名作函數(shù)參數(shù) 第47頁(yè)第47頁(yè) 數(shù)組名作函數(shù)參數(shù)小結(jié): 2.用數(shù)組元素作實(shí)參時(shí),形參變量和實(shí)參數(shù)組元素是由編譯系統(tǒng)分派兩個(gè)不同內(nèi)存單元,在函數(shù)調(diào)用時(shí)實(shí)參加形參
31、之間采取“數(shù)據(jù)復(fù)制”方式傳遞數(shù)據(jù)。用數(shù)組名作函數(shù)參數(shù)時(shí),所采取是“地址傳遞”方式,也就是說(shuō)把實(shí)參數(shù)組首地址賦予形參數(shù)組名。 這么形參數(shù)組和實(shí)參數(shù)組實(shí)為同一數(shù)組,共同擁有一段內(nèi)存空間。6.7.2 數(shù)組名作函數(shù)參數(shù) 第48頁(yè)第48頁(yè)6.8 變量存儲(chǔ)類型 6.8.1 變量定義方式在C語(yǔ)言中每個(gè)變量都有兩個(gè)屬性: 數(shù)據(jù)類型 存儲(chǔ)類型 變量完整定義格式應(yīng)為:存儲(chǔ)類型標(biāo)識(shí)符 數(shù)據(jù)類型標(biāo)識(shí)符 變量名;詳細(xì)來(lái)說(shuō)包括四種: 自動(dòng)(auto),靜態(tài)(static), 存儲(chǔ)器(register),外部(extern)。第49頁(yè)第49頁(yè)6.8.2 變量存儲(chǔ)位置、生存期以及作用域 變量存儲(chǔ)位置分為三部分: 程序區(qū)、靜態(tài)
32、存儲(chǔ)區(qū)和動(dòng)態(tài)存儲(chǔ)區(qū)。 變量生存期分為兩種: 靜態(tài)存儲(chǔ)和動(dòng)態(tài)存儲(chǔ) 變量作用域分為兩種: 局部變量和全局變量 (1)靜態(tài)存儲(chǔ):變量存儲(chǔ)在內(nèi)存中靜態(tài)存儲(chǔ)區(qū),在編譯時(shí)就分派了內(nèi)存單元(存儲(chǔ)空間),在整個(gè)程序運(yùn)營(yíng)期間,該變量占有固定存儲(chǔ)單元,變量值都始終存在,程序結(jié)束后,這部分空間才釋放。這類變量生存期為整個(gè)程序。 (2)動(dòng)態(tài)存儲(chǔ):變量存儲(chǔ)在內(nèi)存中動(dòng)態(tài)存儲(chǔ)區(qū),在程序運(yùn)營(yíng)過(guò)程中,只有當(dāng)變量所在函數(shù)被調(diào)用時(shí),編譯系統(tǒng)暫時(shí)為該變量分派一段內(nèi)存單元,該變量有值,函數(shù)調(diào)用結(jié)束,變量值消失,這部分空間釋放。我們說(shuō)這類變量生存期僅在函數(shù)調(diào)用期間。 第50頁(yè)第50頁(yè)局部變量-內(nèi)部變量定義:在一個(gè)函數(shù)或復(fù)合語(yǔ)句內(nèi)定義變量
33、,稱為局部變量。局部變量?jī)H在定義它函數(shù)或復(fù)合語(yǔ)句內(nèi)有效。變量作用域: 注意: 1.函數(shù)形參以及函數(shù)體內(nèi)或復(fù)合語(yǔ)句內(nèi)定義變量均屬于局部變量。 2.不同函數(shù)中同名變量,占不同內(nèi)存單元。第51頁(yè)第51頁(yè)func( )int x=3;int x=2; /*復(fù)合語(yǔ)句中局部變量x */printf(func1: x=%dn, x); /*輸出復(fù)合語(yǔ)句中變量x */printf(func2: x=%dn, x); /*輸出函數(shù)func中變量x */main( )int x=10;printf(main1: x=%dn, x); /*輸出主函數(shù)內(nèi)變量 x */func( ); printf(main2: x=
34、%dn, x); /*輸出主函數(shù)內(nèi)變量x */運(yùn)營(yíng)結(jié)果:main1: x=10 func1: x=2 func2: x=3 main2: x=10 例6-19 局部變量舉例 第52頁(yè)第52頁(yè) 全局變量-外部變量 定義:假如變量是在所有函數(shù)之外定義,就稱為全局變量,其作用范圍為從定義處開(kāi)始,到源文件結(jié)束。 變量作用域: 闡明: 假如在定義之前使用該全局變量,用extern加以申明,則可擴(kuò)展全局變量作用域?yàn)閺膃xtern申明開(kāi)始到源文獻(xiàn)結(jié)束。 第53頁(yè)第53頁(yè)int x=100; /*定義全局變量x并初始化*/main( )int x=10; /*定義局部變量x,main函數(shù)內(nèi)有效 */ func
35、1( ); func2( ); printf(main: x=%dn, x);func1( )int x=500; /*定義局部變量x,func1函數(shù)內(nèi)有效 */ x += 100; printf(func1: x=%dn, x);func2( )x+=100; /* 使用全局變量 */ printf (func2: x=%dn, x); /*輸出全局變量x */運(yùn)營(yíng)結(jié)果:func1: x=600func2: x=200main: x=10 例6-20 全局變量舉例 第54頁(yè)第54頁(yè) 全局變量和局部變量小結(jié): 1.不同函數(shù)內(nèi)局部變量能夠同名,互不影響。 2.全局變量與局部變量能夠同名,在局部變
36、量起作用范圍內(nèi),全局變量不起作用。 3.全局變量初始化只能有一次,而且是在對(duì)全局變量定義時(shí)候。 變量作用域:第55頁(yè)第55頁(yè)auto int x; 闡明: 1.它屬于動(dòng)態(tài)存儲(chǔ)方式變量。 2.它定義必須在一個(gè)函數(shù)體內(nèi)或復(fù)合語(yǔ)句內(nèi)進(jìn)行。 3.它作用域和生存期均局限于定義它函數(shù)和復(fù)合語(yǔ)句內(nèi)。 4.語(yǔ)言要求,函數(shù)內(nèi)凡未加存儲(chǔ)類型闡明變量均視為自動(dòng)變量。在前面各章程序中所定義變量(局部變量)凡未加存儲(chǔ)類型闡明符都是自動(dòng)變量。函數(shù)形參也屬于這類。auto int i,j,k;int i,j,k; 6.8.3 auto變量自動(dòng)變量auto 數(shù)據(jù)類型 變量名;auto變量定義格式:第56頁(yè)第56頁(yè)regist
37、er int i; 闡明: 1.普通對(duì)于循環(huán)次數(shù)較多循環(huán)控制變量及循環(huán)體內(nèi)重復(fù)使用變量均可定義為存儲(chǔ)器變量。 2.只有局部自動(dòng)變量和形參才干夠定義為存儲(chǔ)器變量。 3.在 Turbo C,MS C等微機(jī)上使用語(yǔ)言中,事實(shí)上是把存儲(chǔ)器變量當(dāng)成自動(dòng)變量處理。 因此速度并不能提升。6.8.4 register變量存儲(chǔ)器變量 register 數(shù)據(jù)類型 變量名;register變量定義格式:第57頁(yè)第57頁(yè)main()register int i,s=0;for(i=1;i=300;i+)s=s+i;printf(s=%dn,s);運(yùn)營(yíng)結(jié)果:s=45150 例6-21 求1+2+3+300之和 定義i,
38、s為存儲(chǔ)器變量第58頁(yè)第58頁(yè) 6.8.5 extern變量extern 數(shù)據(jù)類型 變量名; 外部變量申明格式: 外部變量定義: 外部變量就是定義在函數(shù)之外變量,又稱為全局變量。它作用域從變量定義處開(kāi)始,到本程序文獻(xiàn)末尾。有時(shí)為了擴(kuò)展外部變量作用域,就需要用extern進(jìn)行申明 第59頁(yè)第59頁(yè) 闡明: 1.外部變量存儲(chǔ)在內(nèi)存靜態(tài)存儲(chǔ)區(qū),屬于靜態(tài)存儲(chǔ)方式, 定義變量時(shí)就為變量分派了相應(yīng)內(nèi)存單元, 并始終占用該存儲(chǔ)單元,直至整個(gè)程序結(jié)束。 2.外部變量作用域是從變量定義之處開(kāi)始,到源文獻(xiàn)末尾。 3.使用外部變量申明語(yǔ)句來(lái)擴(kuò)展外部變量作用域,能夠使其在整個(gè)程序范圍內(nèi)都有效。 6.8.5 exter
39、n變量第60頁(yè)第60頁(yè)在由一個(gè)源文獻(xiàn)構(gòu)成程序內(nèi)申明外部變量int a,b; /*外部變量*/void f1() float x,y; /*外部變量*/int f2() /*f2函數(shù)體略*/main() /*main函數(shù)體略*/x,y作用域a,b作用域extern float x,y;申明后x,y作用域第61頁(yè)第61頁(yè) 注意: 在一個(gè)函數(shù)之前定義全局變量,在該函數(shù)內(nèi)使用可不再加以申明。比如:外部變量a,b是在f1, f2和main函數(shù)之前定義,因此,這 3個(gè)函數(shù)內(nèi)可以不用extern申明而直接使用。而外部變量x,y是在f1函數(shù)之后,f2,main函數(shù)之前定義,因此f2,main函數(shù)內(nèi)能夠直接使用
40、而省略變量申明,但f1函數(shù)內(nèi)要想使用x,y就必須加以申明。在由一個(gè)源文獻(xiàn)構(gòu)成程序內(nèi)申明外部變量第62頁(yè)第62頁(yè) 注意: 外部變量申明與外部變量定義不同。外部變量定義必須在全部函數(shù)之外,且只能定義一次,定義時(shí)能夠賦初值。外部變量申明出現(xiàn)在要使用該外部變量各個(gè)函數(shù)體內(nèi),表明要在函數(shù)內(nèi)使用該外部變量。在整個(gè)程序內(nèi),外部變量申明可能出現(xiàn)多次,而且聲明時(shí)不能再賦初值。在由一個(gè)源文獻(xiàn)構(gòu)成程序內(nèi)申明外部變量第63頁(yè)第63頁(yè)例6-22 分析程序運(yùn)營(yíng)結(jié)果。int vs(int l,int w)extern int h;int v;v=l*w*h;return v;main()extern int w,h; in
41、t l=5; printf(v=%d,vs(l,w);int l=3,w=4,h=5; 運(yùn)營(yíng)結(jié)果:v=100 h為全局變量值5l為 局部變量值5, w為全局變量值4第64頁(yè)第64頁(yè)例6-23 不同源文件中外部變量定義與申明。/*file1.c*/int x =10; /* 定義外部變量x */int y =10; /* 定義外部變量y */void add ( void )y=10+x;x*=2;main ( )extern void sub();x += 5;add( ); sub( ); printf (x=%d; y=%dn, x, y);/*file2.c*/void sub (voi
42、d) extern int x; x -= 5; 程序運(yùn)營(yíng)結(jié)果為: x=25; y=25 在由多個(gè)源文獻(xiàn)構(gòu)成程序中申明外部變量 第65頁(yè)第65頁(yè)6.8.6 static變量static int c;1.它屬于靜態(tài)存儲(chǔ)方式變量。2.靜態(tài)局部變量在函數(shù)或復(fù)合語(yǔ)句內(nèi)定義。3.它作用域局限于定義它函數(shù)和復(fù)合語(yǔ)句內(nèi)。 但它生存期為整個(gè)程序。靜態(tài)變量定義格式:static 數(shù)據(jù)類型 變量名;闡明:第66頁(yè)第66頁(yè) 定義: 當(dāng)在函數(shù)體或復(fù)合語(yǔ)句內(nèi)用static來(lái)申明一個(gè)變量時(shí),該變量就被稱為靜態(tài)局部變量。main(). static int a,b; 靜態(tài)局部變量 1.它屬于靜態(tài)存儲(chǔ)方式變量,因此它生存期為
43、整個(gè)程序運(yùn)營(yíng)期間 。 2.靜態(tài)局部變量在函數(shù)或復(fù)合語(yǔ)句內(nèi)定義,因此它作用域局限于定義它函數(shù)和復(fù)合語(yǔ)句內(nèi)。闡明:定義靜態(tài)局部變量a,b第67頁(yè)第67頁(yè)靜態(tài)局部變量 3.對(duì)靜態(tài)局部變量是在編譯時(shí)賦初值,且只能賦初值一次。 4.如在定義時(shí)對(duì)靜態(tài)局部變量未賦初值,則編譯時(shí)系統(tǒng)自動(dòng)賦初值0(對(duì)數(shù)值型變量)或空字符(對(duì)字符變量)。闡明:第68頁(yè)第68頁(yè)main( )void inc1( ), inc2( );inc1( ); inc1( ); inc1( );inc2( ); inc2( ); inc2( );void inc1( )int x=0; x+;printf (in inc1 x=%dn, x
44、);void inc2( )static int x=0; /*定義靜態(tài)局部變量x,賦初值0*/ x+; printf (in inc2 x=%dn, x);程序運(yùn)營(yíng)結(jié)果為: in inc1 x=1 in inc1 x=1 in inc1 x=1 in inc2 x=1 in inc2 x=2 in inc2 x=3 例 6-24 分析程序運(yùn)營(yíng)結(jié)果。第69頁(yè)第69頁(yè) 定義: 靜態(tài)全局變量(又稱靜態(tài)外部變量)是在函數(shù)之外用static定義變量。static int a,b; main().靜態(tài)全局變量 1. 假如在程序設(shè)計(jì)中希望一些變量只限于被本文件使用,而不能被其它文件使用, 則能夠在定義全局變量時(shí)加上static就組成了靜態(tài)全局變量。 2. 把局部變量變?yōu)殪o態(tài)局部變量后是改變了它存放區(qū)域以及它生存期。把全局變量變?yōu)殪o態(tài)全局變量
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 普通話口語(yǔ)訓(xùn)練(課件)
- 【物理課件】透鏡成像作圖法課件
- 材料物理化學(xué)課件緒論
- 《BA工法簡(jiǎn)介》課件
- 湖南省株洲市淥口區(qū)第三中學(xué)、健坤瀟湘高級(jí)中學(xué)2024-2025學(xué)年高二上學(xué)期期末考試歷史試題(含答案)
- 單位管理制度收錄大全【人事管理篇】
- 單位管理制度收錄大合集【員工管理篇】
- 部分省市補(bǔ)貼政策延續(xù)有望穩(wěn)健過(guò)渡車企陸續(xù)公布2025年銷量目標(biāo)
- 整式的加減(去括號(hào))-課件
- 2024-2026年中國(guó)新能源融資租賃市場(chǎng)深度分析及投資戰(zhàn)略咨詢報(bào)告
- 期末綜合試卷(含答案)2024-2025學(xué)年蘇教版數(shù)學(xué)四年級(jí)上冊(cè)
- 2024-2025學(xué)年人教版道法八年級(jí)上冊(cè) 第一學(xué)期期末測(cè)試卷01
- 2024新教科版一年級(jí)科學(xué)上冊(cè)全冊(cè)教案
- 徐州市2023-2024學(xué)年八年級(jí)上學(xué)期期末地理試卷(含答案解析)
- 人教版數(shù)學(xué)小學(xué)二年級(jí)上冊(cè)無(wú)紙筆測(cè)試題
- 浩揚(yáng)電子書(shū)城httpwww.chnxp.com.cn收
- GA 1809-2022城市供水系統(tǒng)反恐怖防范要求
- 國(guó)家開(kāi)放大學(xué)(電大)土木工程力學(xué)網(wǎng)考答案整理
- 教學(xué)改革計(jì)劃項(xiàng)目申請(qǐng)書(shū)模板
- 東神汽車售后服務(wù)手冊(cè)
- 浙江省林區(qū)道路建設(shè)技術(shù)指南
評(píng)論
0/150
提交評(píng)論