《CC++語(yǔ)言程序設(shè)計(jì)》課件第5章 函數(shù)_第1頁(yè)
《CC++語(yǔ)言程序設(shè)計(jì)》課件第5章 函數(shù)_第2頁(yè)
《CC++語(yǔ)言程序設(shè)計(jì)》課件第5章 函數(shù)_第3頁(yè)
《CC++語(yǔ)言程序設(shè)計(jì)》課件第5章 函數(shù)_第4頁(yè)
《CC++語(yǔ)言程序設(shè)計(jì)》課件第5章 函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩82頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

2024/12/9第5章函數(shù)與預(yù)處理命令

5.1C程序結(jié)構(gòu)5.2函數(shù)定義5.3函數(shù)調(diào)用和函數(shù)說(shuō)明5.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用5.5變量的作用域與存儲(chǔ)方式5.6函數(shù)間的數(shù)據(jù)傳遞5.7指針函數(shù)5.8函數(shù)指針2024/12/95.1C程序結(jié)構(gòu)①程序結(jié)構(gòu)清晰,可讀性好。②減少重復(fù)編碼的工作量。③可多人共同編制一個(gè)大程序,縮短程序設(shè)計(jì)周期,提高程序設(shè)計(jì)和調(diào)試的效率。使用函數(shù)的好處……C程序源程序文件n函數(shù)1函數(shù)m……源程序文件1函數(shù)1函數(shù)n2024/12/9⑴一個(gè)C源程序可以由一個(gè)或多個(gè)源程序文件組成。C編譯系統(tǒng)在對(duì)C源程序進(jìn)行編譯時(shí)是以文件為單位進(jìn)行的。⑵一個(gè)C源程序文件可以由一個(gè)或多個(gè)函數(shù)組成。所有函數(shù)都是獨(dú)立的。主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)可以相互調(diào)用。⑶在一個(gè)C程序中,有且僅有一個(gè)主函數(shù)main。C程序的執(zhí)行總是從main函數(shù)開(kāi)始,調(diào)用其它函數(shù)后最終回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。說(shuō)明2024/12/9函數(shù)的種類從函數(shù)定義形式分:①有參函數(shù):在主調(diào)(用)函數(shù)和被調(diào)(用)函數(shù)之間通過(guò)參數(shù)進(jìn)行數(shù)據(jù)傳遞,如:

intcube(intx){…}

②無(wú)參函數(shù):如:getchar()在調(diào)用無(wú)參函數(shù)時(shí),主調(diào)函數(shù)不需要將數(shù)據(jù)傳遞給無(wú)參函數(shù)。從使用的角度看:①標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù))庫(kù)函數(shù)是由系統(tǒng)提供的。如:getchar()、sin(x)等。在程序中可以直接調(diào)用它們。附錄A列出了C的部分庫(kù)函數(shù)。②用戶自定義函數(shù)。從是否有返回值的角度:①有返回值函數(shù)②無(wú)返回值函數(shù)從函數(shù)調(diào)用的角度:

①主調(diào)函數(shù):主調(diào)函數(shù)是調(diào)用其它函數(shù)來(lái)實(shí)現(xiàn)功能的函數(shù)。如main()函數(shù)。②被調(diào)函數(shù):被主調(diào)函數(shù)調(diào)用的函數(shù)。5.2函數(shù)定義無(wú)參函數(shù)的定義格式

返回值類型函數(shù)名()

{

說(shuō)明部分 語(yǔ)句部分}【例5.1】編寫一個(gè)函數(shù),輸出"Howareyou!"。voidoutput(){ printf("Howareyou!\n");}沒(méi)有形式參數(shù)為無(wú)參函數(shù)

5.2函數(shù)定義

說(shuō)明:(1)函數(shù)體內(nèi)可以是0條、1條或多條語(yǔ)句。當(dāng)函數(shù)體是0條語(yǔ)句時(shí),稱該函數(shù)為空函數(shù)。(2)所有函數(shù)都是平行的,即在定義函數(shù)時(shí)是相互獨(dú)立的,一個(gè)函數(shù)并不從屬于另一函數(shù),即函數(shù)不能嵌套定義。5.2函數(shù)定義【例5.2】錯(cuò)誤的函數(shù)嵌套定義。

voidquestion()

{

printf("Howareyou?");

voidanswer()/*非法,錯(cuò)誤的嵌套定義*/

{

printf("Fine,thankyou.");

}}2024/12/95.2函數(shù)定義有參函數(shù)的定義格式

返回值類型函數(shù)名(參數(shù)表列)

{

說(shuō)明部分 語(yǔ)句部分

}5.2函數(shù)定義【例5.3】將給定的十進(jìn)制整數(shù)轉(zhuǎn)換成相應(yīng)的字符串輸出。

#include"stdio.h" voidchange(intn){charstr[10];inti;if(n<0){putchar('-');/*如果是負(fù)數(shù),先輸出一個(gè)’-’號(hào)*/n=-n;

/*n轉(zhuǎn)換成正數(shù)*/}5.2函數(shù)定義i=0;do{ str[i++]=n%10+'0';/*依次取出個(gè)、十、百…位數(shù)值,轉(zhuǎn)換成相應(yīng)的字符*/n/=10;}while(n>0);while(--i>=0)putchar(str[i]);/*倒序輸出*/}

5.2函數(shù)定義voidmain() {inti; printf("Pleaseinputanintegernumber:"); scanf("%d",&i);printf("Thestringis:"); change(i);/*調(diào)用有參函數(shù)*/ }程序的運(yùn)行結(jié)果為:Pleaseinputanintegernumber:139Thestringis:1395.2函數(shù)定義函數(shù)返回值和return語(yǔ)句形式: return(表達(dá)式); return表達(dá)式; return;因此,return語(yǔ)句具有兩個(gè)重要的用途:第一,使函數(shù)立即退出程序的執(zhí)行返回給調(diào)用者。第二,可以向調(diào)用者返回值。5.2函數(shù)定義 【例5.4】定義一個(gè)函數(shù),其功能為求三個(gè)整數(shù)中的最大值。

#include"stdio.h" intmax(intx,inty,intz) {inttemp;

temp=x; if(y>temp)temp=y; if(z>temp)temp=z;

returntemp; }

5.2函數(shù)定義voidmain() {inta,b,c; intmax_value; printf("Pleaseinput3integernumbers:"); scanf("%d%d%d",&a,&b,&c); max_value=max(a,b,c); printf("\nThemaxvalueis%d.\n",max_value); }5.2函數(shù)定義

說(shuō)明: (1)return語(yǔ)句中表達(dá)式的類型應(yīng)與函數(shù)返回值類型一致,如果不一致,則以函數(shù)返回值的類型為準(zhǔn),對(duì)于數(shù)值型數(shù)據(jù)將自動(dòng)進(jìn)行類型轉(zhuǎn)換。(2)一個(gè)函數(shù)中可以有多個(gè)return語(yǔ)句,函數(shù)在碰到第一個(gè)return語(yǔ)句時(shí)返回,函數(shù)返回值為第一個(gè)return語(yǔ)句中表達(dá)式的值。5.2函數(shù)定義(3)若函數(shù)體內(nèi)沒(méi)有return語(yǔ)句,就一直執(zhí)行到函數(shù)體的末尾后返回調(diào)用函數(shù)。這時(shí)會(huì)帶回一個(gè)不確定的函數(shù)值,若確實(shí)不要求帶回函數(shù)值,則應(yīng)將函數(shù)定義為void類型。(4)主函數(shù)main()向調(diào)用進(jìn)程(一般是操作系統(tǒng))返回一個(gè)整數(shù)。用return從main()中返回一個(gè)值等價(jià)于用同一值調(diào)用exit()函數(shù)。如果main()中未明確返回值,返回調(diào)用進(jìn)程的值在技術(shù)上沒(méi)有定義。2024/12/9函數(shù)名()5.3

函數(shù)調(diào)用和函數(shù)說(shuō)明無(wú)參函數(shù)調(diào)用的一般形式:有參函數(shù)調(diào)用的一般形式:函數(shù)名(參數(shù)表)

按照被調(diào)函數(shù)在主調(diào)函數(shù)中出現(xiàn)的位置來(lái)分,可以有以下三種函數(shù)調(diào)用方式: (1)函數(shù)調(diào)用作為一個(gè)語(yǔ)句。 (2)函數(shù)調(diào)用出現(xiàn)在表達(dá)式中,這時(shí)要求被調(diào)函數(shù)必須帶有返回值,返回值將參加表達(dá)式的運(yùn)算。(3)函數(shù)調(diào)用作為函數(shù)的實(shí)參。5.3

函數(shù)調(diào)用和函數(shù)說(shuō)明5.3

函數(shù)調(diào)用和函數(shù)說(shuō)明 【例5.5】庫(kù)函數(shù)pow(a,b)的功能是求ab,在主函數(shù)中調(diào)用該函數(shù)的程序?yàn)椋?/p>

#include<stdio.h> #include<math.h> voidmain() { inta=2,b=3,i=3,j=2; doublec;

c=pow(a,i)+pow(b,j); printf("c=%f",c); }

程序運(yùn)行結(jié)果為:

c=17.0000005.3

函數(shù)調(diào)用和函數(shù)說(shuō)明

函數(shù)原型說(shuō)明的一般形式為:

其中,圓括號(hào)說(shuō)明它前面的標(biāo)識(shí)符是一個(gè)函數(shù),注意不能省略,如果省略,就成為一般變量的說(shuō)明了。返回值類型函數(shù)名(參數(shù)類型表);5.3

函數(shù)調(diào)用和函數(shù)說(shuō)明【例5.6】定義一個(gè)函數(shù),函數(shù)suv()功能為求兩個(gè)浮點(diǎn)數(shù)之差,并在主函數(shù)中調(diào)用此函數(shù)。

#include"stdio.h" voidmain() {floatsuv(float,float);/*對(duì)suv函數(shù)進(jìn)行說(shuō)明*/ floatx1,x2,x3; printf("inputx1,x2:"); scanf("%f%f",&x1,&x2); x3=suv(x1,x2); printf("\nsuv=%6.2f",x3);}

5.3

函數(shù)調(diào)用和函數(shù)說(shuō)明floatsuv(floatx,floaty) {printf("%f,%f",x,y); return(x-y);}程序運(yùn)行結(jié)果:Inputm:x1,x2:5.16.25.1000006.200000suv=-1.105.3

函數(shù)調(diào)用和函數(shù)說(shuō)明

C語(yǔ)言中規(guī)定在下列幾種情況下,可以省去主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)的說(shuō)明:

(1)如果被調(diào)函數(shù)定義出現(xiàn)在主調(diào)函數(shù)定義之前,在主調(diào)函數(shù)中不必對(duì)被調(diào)函數(shù)進(jìn)行原型說(shuō)明。 (2)如在所有函數(shù)定義之前,在函數(shù)外預(yù)先說(shuō)明了各個(gè)函數(shù)的類型,則在以后的各主調(diào)函數(shù)中,可不再對(duì)被調(diào)函數(shù)作說(shuō)明。 (3)對(duì)庫(kù)函數(shù)的調(diào)用不需要再作說(shuō)明,但必須把該函數(shù)的頭文件用#include命令包含在源文件頭部。5.3.4函數(shù)調(diào)用的執(zhí)行過(guò)程【例5.7】編寫計(jì)算求n!的函數(shù)。程序運(yùn)行結(jié)果:Inputm:33!=65.3.4函數(shù)調(diào)用的執(zhí)行過(guò)程

調(diào)用函數(shù)的過(guò)程分為如下幾步: 第一步,將實(shí)參的值賦給形參。 第二步,將程序執(zhí)行流程從主調(diào)函數(shù)的調(diào)用語(yǔ)句轉(zhuǎn)到被調(diào)函數(shù)的定義部分,執(zhí)行被調(diào)函數(shù)的函數(shù)體; 第三步,當(dāng)執(zhí)行到被調(diào)函數(shù)函數(shù)體的第一個(gè)return語(yǔ)句或者最右邊的一個(gè)大花括號(hào)時(shí),程序執(zhí)行流程返回到主調(diào)函數(shù)的調(diào)用語(yǔ)句。如果調(diào)用語(yǔ)句是表達(dá)式的一部分,則應(yīng)用函數(shù)的返回值參與表達(dá)式運(yùn)算之后繼續(xù)向下執(zhí)行;如果調(diào)用語(yǔ)句是單獨(dú)一條語(yǔ)句則直接繼續(xù)向下執(zhí)行。第四步,返回主調(diào)函數(shù),帶回返回值。5.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用5.4.1函數(shù)的嵌套調(diào)用函數(shù)定義部分不能嵌套,各個(gè)函數(shù)定義是相對(duì)獨(dú)立的,但是任何函數(shù)內(nèi)部都可以調(diào)用另外的函數(shù)(不包含main()函數(shù))。這樣一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù),而另一個(gè)函數(shù)又可以調(diào)用其他的函數(shù)的調(diào)用過(guò)程,就形成了函數(shù)的嵌套調(diào)用。

【例5.8】編寫計(jì)算=值的程序

#include<stdio.h> longfact(intx)/*計(jì)算x的階乘*/ {longy; for(y=1;x>0;x--)y=y*x; return(y); } longrequire(intn,intm)/*計(jì)算的值*/ {longz; z=fact(n)/(fact(m)*fact(n-m)); returnz; }

5.4.1函數(shù)的嵌套調(diào)用5.4.1函數(shù)的嵌套調(diào)用voidmain() {intm,n; longintresult; printf("inputnandm:"); scanf("%d,%d",&n,&m); result=require(n,m); printf("\nresult=%ld;",result); }在這個(gè)程序中,函數(shù)調(diào)用執(zhí)行順序如下圖所示。

5.4.1函數(shù)的嵌套調(diào)用5.4.2函數(shù)的遞歸調(diào)用

在調(diào)用一個(gè)函數(shù)的過(guò)程中如果出現(xiàn)直接或間接調(diào)用函數(shù)自身(除主函數(shù)main()外)的過(guò)程,稱為函數(shù)的遞歸調(diào)用。C語(yǔ)言的特點(diǎn)之一就在于允許函數(shù)遞歸調(diào)用。函數(shù)遞歸調(diào)用分為直接調(diào)用和間接調(diào)用,執(zhí)行過(guò)程如圖5.4和圖5.5所示。5.4.2函數(shù)的遞歸調(diào)用

int

f(int

x;)

{

int

y,z;

z=f(y);

return(2*z);

}調(diào)用函數(shù)f()跳出函數(shù)f()再次調(diào)用自己(1)(2)(3)int

f1(int

x)

int

f2(int

t){

{int

y,z;

int

a,c;…

…z=f2(y);z=f1(a);…

…return(2*z);return(2+c);}

}調(diào)用函數(shù)f1()(1)(2)(3)5.4.2函數(shù)的遞歸調(diào)用5.4.2函數(shù)的遞歸調(diào)用【例5.9】用遞歸方法求n!?;赝七^(guò)程:回代過(guò)程:f(5)=5*4*3*2*1f(5)=5*f(4)f(4)=4*3*2*1f(4)=4*f(3)f(3)=3*2*1f(3)=3*f(2)f(2)=2*1f(2)=2*f(1)f(1)=15.4.2函數(shù)的遞歸調(diào)用 #include<stdio.h> longfac(intn) { if(n<0) {printf("n<0,dataerror!"); return0; } elseif(n==0||n==1) return1; else return(fac(n-1)*n); } voidmain() { intn; longy; printf("n="); scanf("%d",&n); y=fac(n); printf("\n%d!=%ld",n,y); }程序運(yùn)行結(jié)果:n=5↙

5!=120

變量完整定義語(yǔ)句格式如下:

完整的變量定義語(yǔ)句包括三個(gè)方面:一是變量的數(shù)據(jù)類型,例如int、float、char等;二是變量的作用域,表示一個(gè)變量在程序中能夠被使用到的范圍,它是由變量定義所在位置決定的;三是變量的存儲(chǔ)類別,表示變量在內(nèi)存中的存儲(chǔ)方式,直接決定了變量占用分配給它存儲(chǔ)空間的時(shí)限。5.5變量的作用域與存儲(chǔ)方式<存儲(chǔ)類別><數(shù)據(jù)類型>變量名[=初始值];5.5.1變量的作用域 1.局部變量在函數(shù)內(nèi)部定義的變量、形參及復(fù)合語(yǔ)句塊中定義的變量都稱為局部變量,局部變量只在定義它的函數(shù)內(nèi)或復(fù)合語(yǔ)句內(nèi)有效,其他的函數(shù)或程序塊不能對(duì)它進(jìn)行存取操作。因此,在不同函數(shù)內(nèi)定義的局部變量可以同名,它們代表的對(duì)象不同,互不影響。5.5.1變量的作用域 關(guān)于局部變量有如下幾點(diǎn)說(shuō)明: (1)主函數(shù)main()中定義的變量只在主函數(shù)中有效,在其他函數(shù)中無(wú)效; (2)函數(shù)中的形參也是局部變量,只在本函數(shù)內(nèi)有效;(3)在一個(gè)函數(shù)內(nèi)部復(fù)合語(yǔ)句中可以定義變量,這些變量只在本復(fù)合語(yǔ)句中有效; (4)不同的函數(shù)內(nèi)部可以定義相同名字的變量,它們名字雖然相同,但代表的對(duì)象卻不同,為它們分配的存儲(chǔ)單元也不同。5.5.1變量的作用域【例5.11】分析下面程序的運(yùn)行結(jié)果。

#include<stdio.h> voidmain() {intx;/*主函數(shù)內(nèi)定義的局部變量*/x=10;if(x==10){intx;/*if復(fù)合語(yǔ)句中定義的局部變量*/x=100;printf("Innerx:%d\n",x);}printf("Outerx:%d\n",x);}程序的運(yùn)行結(jié)果為:Innerx:100Outerx:105.5.1變量的作用域 2.全局變量 全局變量又稱作外部變量、全程變量,是在函數(shù)外部定義的變量。其有效范圍為從定義變量的位置開(kāi)始到本源文件結(jié)束。全局變量的使用說(shuō)明: (1)盡量限制全局變量的使用。 (2)全局變量的定義與說(shuō)明有所區(qū)別。 (3)同一個(gè)源文件中局部變量與全局變量可以同名,在局部變量的作用范圍內(nèi),全局變量被屏蔽不起作用。5.5.1變量的作用域【例5.13】在程序中使用同名的全局變量與局部變量。

#include<stdio.h>inta=4,b=7;

/*a,b為外部變量*/

intmax(inta,intb)

/*a,b為局部變量*/{

intc;

c=a>b?a∶b;

/*形參a、b作用范圍*/

return(c);

}voidmain(){

inta=9;

/*a為局部變量*/

printf(″max=%d″,max(a,b));

/*全局變量與局部變量同名,全局變量a失效,b為全局變量*/

}程序運(yùn)行結(jié)果為:max=95.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式

在C語(yǔ)言中每一個(gè)變量和函數(shù)都有兩個(gè)屬性:數(shù)據(jù)類型和存儲(chǔ)類別,其中數(shù)據(jù)類型在前面已經(jīng)介紹過(guò)。存儲(chǔ)類別分為兩大類:靜態(tài)存儲(chǔ)類別和動(dòng)態(tài)存儲(chǔ)類別,具體包括四種:自動(dòng)(auto)、靜態(tài)(static)、寄存器(register)和外部(extern)。5.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式 1.局部變量的存儲(chǔ)方式(1)自動(dòng)局部變量(簡(jiǎn)稱自動(dòng)變量)。用關(guān)鍵字auto作存儲(chǔ)類型說(shuō)明,存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)。當(dāng)局部變量未指明存儲(chǔ)類別時(shí),默認(rèn)為auto存儲(chǔ)類別。(2)靜態(tài)局部變量。用關(guān)鍵字static作存儲(chǔ)類型說(shuō)明,存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū),在程序運(yùn)行期間占據(jù)一個(gè)永久性的存儲(chǔ)單元,即使在退出函數(shù)后,存儲(chǔ)空間仍舊存在,直到源程序運(yùn)行結(jié)束為止。注意形參不允許說(shuō)明為靜態(tài)存儲(chǔ)類別。

5.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式(3)寄存器變量是將局部變量的值放在CPU的通用寄存器中,以此來(lái)提高程序的執(zhí)行效率。寄存器變量用關(guān)鍵字register說(shuō)明。5.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式【例5.14】分析下面程序運(yùn)行結(jié)果。

#include"stdio.h"voidf1() { intx=0;/*A*/ x++; printf("x=%d\n",x); } voidmain(){f1(); f1();}

程序運(yùn)行結(jié)果為:

x=1 x=15.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式 【例5.15】計(jì)算s=x1+x2+x3+…+xn,x和n由鍵盤輸入。

#include"stdio.h" longsum(registerintx,intn) { longresult; inti; registerinttemp; temp=result=x; for(i=2;i<=n;i++) { temp*=x; result+=temp; } returnresult; }

5.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式voidmain() { intx,n; printf("inputx,n:"); scanf("%d,%d",&x,&n); printf("sum=%ld\n",sum(x,n)); }執(zhí)行進(jìn)輸入:inputx,n:3,4sum=1205.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式說(shuō)明: (1)寄存器變量的數(shù)據(jù)類型。 傳統(tǒng)上,存儲(chǔ)類型說(shuō)明符register只適于int、char或指針變量。然而,標(biāo)準(zhǔn)的C語(yǔ)言拓寬了它的定義,使之適用于各種變量。但在實(shí)踐中,register一般只對(duì)整型和字符型有實(shí)際作用。因此,一般不期望其他類型的register變量實(shí)質(zhì)性地改善處理速度。

(2)寄存器變量的存儲(chǔ)。最初,寄存器變量(register)說(shuō)明符要求C編譯程序把寄存器變量的值保存在CPU寄存器中,不像普通變量那樣保存在內(nèi)存中。目前,雖然register的定義被擴(kuò)展,可應(yīng)用于任何類型的變量,然而實(shí)踐中,字符和整數(shù)仍放在CPU的寄存器內(nèi),數(shù)組等大型對(duì)象顯然不能放入寄存器,但只要聲明為register變量,還是可以得到編譯程序的優(yōu)化處理?;贑編譯的實(shí)現(xiàn)和運(yùn)行的操作系統(tǒng)環(huán)境,編譯程序可以用自己認(rèn)為合適的一切辦法處理register變量。5.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式(3)寄存器變量的存儲(chǔ)類別。

只有局部自動(dòng)變量和形式參數(shù)可說(shuō)明為寄存器變量,局部靜態(tài)變量不能定義為寄存器變量,例如不能寫成:

register

static

a,b;

因此,全局寄存器變量是非法的。因?yàn)椴荒馨炎兞糠旁陟o態(tài)存儲(chǔ)區(qū)中,又放在寄存器中,二者只能居其一。

(4)寄存器變量的數(shù)量。一個(gè)計(jì)算機(jī)系統(tǒng)的寄存器數(shù)目是有限的,不能定義任意多個(gè)寄存器變量。一些操作系統(tǒng)對(duì)寄存器的使用做了數(shù)量的限制。或多或少,或根本不提供,用自動(dòng)變量來(lái)替代。 注意:C語(yǔ)言中不允許取寄存器變量的地址。因?yàn)榧拇嫫髯兞靠梢苑旁贑PU的寄存器中,該寄存器通常是不編地址的。5.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式 2.全局變量的存儲(chǔ)方式 全局變量的存儲(chǔ)方式為靜態(tài)存儲(chǔ),在靜態(tài)存儲(chǔ)區(qū)分配存儲(chǔ)單元。分為外部存儲(chǔ)全局變量和靜態(tài)全局變量,分別用extern和static關(guān)鍵字說(shuō)明。 (1)外部存儲(chǔ)全局變量。5.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式 說(shuō)明: ①外部存儲(chǔ)全局變量在程序被編譯時(shí)分配存儲(chǔ)單元,它的生命周期是程序的整個(gè)執(zhí)行過(guò)程。其作用域是從外部存儲(chǔ)全局變量定義之后,直到該源文件結(jié)束的所有函數(shù)。 ②外部存儲(chǔ)全局變量初始化是在外部存儲(chǔ)全局變量定義時(shí)進(jìn)行的,且其初始化僅執(zhí)行一次,若無(wú)顯式初始化,則系統(tǒng)自動(dòng)初始化為與變量類型相同的0值(整型0,字符型’\0’,浮點(diǎn)型0.0)。在有顯式初始化的情況下,初值必須是常量表達(dá)式,外部變量在程序執(zhí)行之前分配存儲(chǔ)單元,在程序運(yùn)行結(jié)束后才被收回。

5.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式③用extern既可以用來(lái)擴(kuò)展全局變量在本文件中的作用域,又可以使全局變量的作用域從一個(gè)文件擴(kuò)展到程序中的其它文件。系統(tǒng)在編譯時(shí)遇到extern時(shí),先在本文件中找全局變量的定義,如果找到,就在本文件中擴(kuò)展作用域。如果找不到,就在連接時(shí)從其他文件中找全局變量的定義,如果找到,就將作用域擴(kuò)展到本文件。如果找不到,則按出錯(cuò)處理。5.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式 【例5.16】用extern將全局變量的作用域擴(kuò)展到其他文件。本程序的作用是給定b的值,輸入a和m,求a×b和am的值。

文件filel.c中的內(nèi)容為:

intA;

/*定義全局變量*/ voidmain() {

intpower(int);

/*對(duì)調(diào)用函數(shù)作聲明*/ intb=3,c,d,m; printf("enterthenumberaanditspowerm:\n"); scanf("%d,%d",&a,&m); c=A*b;

5.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式printf("%d*%d=%d\n",A,b,c); d=power(m); printf("%d*%d=%d",A,m,d); }

文件file2.c中的內(nèi)容為:

externA;

/*聲明A為一個(gè)已定義的全局變量*/ intpower(intn) { inti,y=1; for(i=1;i<=n;i++) y=y*A;

return(y); }5.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式

(2)靜態(tài)全局變量靜態(tài)全局變量用關(guān)鍵字static作存儲(chǔ)類型說(shuō)明。說(shuō)明: ①靜態(tài)全局變量只能在定義它的源文件中對(duì)其進(jìn)行引用,在其他的源文件中即使用extern對(duì)其進(jìn)行說(shuō)明也不能對(duì)它進(jìn)行引用。 ②在同一個(gè)源文件內(nèi),靜態(tài)全局變量或者外部存儲(chǔ)全局變量的作用域都是從定義處至本程序文件的末尾。如果外部變量不在文件的開(kāi)頭處定義,其有效范圍只限于定義處到文件末尾。如果在定義點(diǎn)之前的函數(shù)想引用該外部變量,則應(yīng)該在引用之前用extern對(duì)該變量作“外部變量說(shuō)明”,以擴(kuò)展外部變量的作用域。

5.5.2動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式③靜態(tài)全局變量與外部存儲(chǔ)全局變量的存儲(chǔ)單元都是在靜態(tài)存儲(chǔ)區(qū)中,所以它們?cè)谡麄€(gè)程序的運(yùn)行期間都是有效的。5.6函數(shù)間數(shù)據(jù)傳遞

在函數(shù)調(diào)用時(shí),將由主調(diào)函數(shù)將實(shí)參的值傳送給被調(diào)函數(shù)的形參,或者由被調(diào)函數(shù)向主調(diào)函數(shù)返回?cái)?shù)據(jù)的過(guò)程都稱為函數(shù)間的數(shù)據(jù)傳遞。被調(diào)函數(shù)的形參接受的是實(shí)參的值(實(shí)參的副本)而不是實(shí)參的地址,形參和實(shí)參變量各自存在于不同的存儲(chǔ)單元,是不同的變量。按照實(shí)參傳遞值的類型(即實(shí)參存儲(chǔ)的是值還是指針),函數(shù)間數(shù)據(jù)傳遞分為兩種方式:傳值方式和傳遞地址方式。5.6.1傳值方式傳遞數(shù)據(jù)【例5.18】編寫程序,調(diào)用函數(shù)change(),交換兩個(gè)整型變量中的值。

#include"stdio.h" voidchange(intx,inty)/*交換x和y的值*/ {inttemp; temp=x;x=y;y=temp; printf("x=%d,y=%d\n",x,y); }5.6.1傳值方式傳遞數(shù)據(jù) voidmain() {inta,b; printf("inputa,b:"); scanf("%d,%d",&a,&b); printf("a=%d,b=%d\n",a,b); change(a,b); printf("a=%d,b=%d\n",a,b); }程序運(yùn)行結(jié)果:inputa,b:2,3a=2,b=3;x=3,y=2;a=2,b=3;5.6.2傳地址方式傳遞數(shù)據(jù) 1.指針作為實(shí)參傳遞

【例5.19】修改例5.18,實(shí)現(xiàn)通過(guò)調(diào)用函數(shù)change()交換主調(diào)函數(shù)中兩個(gè)整型變量的值。

#include"stdio.h" voidchange(int*x,int*y) {inttemp; temp=*x;*x=*y;*y=temp; printf("x=%d,y=%d\n",*x,*y) }

5.6.2傳地址方式傳遞數(shù)據(jù)voidmain() {inta,b,*m,*n; printf(“inputa,b:”); scanf("%d,%d",&a,&b); printf("a=%d,b=%d\n",a,b); m=&a; n=&b; change(m,n); printf(“a=%d,b=%d\n”,a,b); }程序運(yùn)行結(jié)果:inputa,b:2,3a=2,b=3;x=3,y=2;a=3,b=2;5.6.2傳地址方式傳遞數(shù)據(jù)【例5.20】按傳地址方式傳遞數(shù)據(jù),對(duì)例5.18的程序進(jìn)行修改,并分析其運(yùn)行結(jié)果。

#include"stdio.h" voidchange(int*x,int*y) {int*temp; temp=x;x=y;y=temp; printf("x=%d,y=%d\n",*x,*y); }

5.6.2傳地址方式傳遞數(shù)據(jù)voidmain() {inta,b,*m,*n; printf("inputa,b:"); scanf("%d,%d",&a,&b); printf("a=%d,b=%d\n",a,b); m=&a; n=&b; change(m,n); printf("a=%d,b=%d\n",a,b); }程序運(yùn)行結(jié)果:inputa,b:2,3a=2,b=3;x=3,y=2;a=2,b=3;5.6.2傳地址方式傳遞數(shù)據(jù)注意:如果要在被調(diào)函數(shù)中改變主調(diào)函數(shù)中變量的值,首先實(shí)參為該變量的地址,并傳遞給形參;其次在被調(diào)函數(shù)的函數(shù)體內(nèi),必需通過(guò)改變形參所指向變量的方式來(lái)改變實(shí)參指向的變量,而僅僅改變形參的值是無(wú)法改變形參所指向的主調(diào)函數(shù)中變量的值。5.6.2傳地址方式傳遞數(shù)據(jù) 2.數(shù)組名作為實(shí)參傳遞 在C語(yǔ)言中,數(shù)組名代表了該數(shù)組在內(nèi)存中的起始地址,當(dāng)數(shù)組名作函數(shù)參數(shù)時(shí),實(shí)參與形參之間傳遞的就是數(shù)組起始地址, 說(shuō)明:當(dāng)數(shù)組名作為函數(shù)的參數(shù)時(shí),在主調(diào)函數(shù)和被調(diào)函數(shù)中要分別定義數(shù)組,實(shí)參數(shù)組和形參數(shù)組必須類型相同,形參數(shù)組可以不指明長(zhǎng)度。5.6.2傳地址方式傳遞數(shù)據(jù)【例5.21】實(shí)現(xiàn)調(diào)用函數(shù)change(),交換主調(diào)函數(shù)中數(shù)組的兩個(gè)任意元素。

#include"stdio.h" voidchange(intx[],intn,inti,intj)/*形參n表示數(shù)組的長(zhǎng)度*/ {inttemp; if(n>i&&n>j){temp=x[i];x[i]=x[j];x[j]=temp; printf("x[%d]=%d,x[%d]=%d\n",i,x[i],j,x[j]); } else printf("數(shù)組元素下標(biāo)i或j越界"); }

5.6.2傳地址方式傳遞數(shù)據(jù)voidmain() {inta[10]={0,1,2,3,4,5,6,7,8,9},i,j; printf("inputi,j(0-9):"); scanf("%d,%d",&i,&j); printf("a[%d]=%d,a[%d]=%d\n",i,a[i],j,a[j]); change(a,10,i,j); printf("a[%d]=%d,a[%d]=%d\n",i,a[i],j,a[j]); }程序運(yùn)行結(jié)果:inputi,j(0-9):2,3a[2]=2,a[3]=3;x[2]=3,x[3]=2;a[2]=3,a[3]=2;5.6.3利用全局變量傳遞數(shù)據(jù)

如果想讓多個(gè)函數(shù)都能對(duì)某個(gè)存儲(chǔ)單元進(jìn)行存取,還可以采用全局變量的方式,因?yàn)閷?duì)所在的源文件中所有函數(shù)而言,全局變量都是可以使用的。

【例5.22】利用全局變量實(shí)現(xiàn)兩個(gè)整數(shù)的交換。

#include"stdio.h" inta,b;/*定義全局變量a,b*/ voidchange() {inttemp; temp=a;a=b;b=temp; printf("a=%d,b=%d\n",a,b); }

5.6.3利用全局變量傳遞數(shù)據(jù)voidmain() {printf("inputa,b:"); scanf("%d,%d",&a,&b); printf("a=%d,b=%d\n",a,b); change(); printf("a=%d,b=%d\n",a,b); }程序運(yùn)行結(jié)果:

inputa,b:2,3 a=2,b=3; a=3,b=2; a=3,b=2;5.7指針函數(shù)當(dāng)一個(gè)函數(shù)的返回值為指針類型時(shí),稱這個(gè)函數(shù)是返回指針的函數(shù),簡(jiǎn)稱指針函數(shù)。 1.指針函數(shù)的定義 指針函數(shù)的一般定義形式為:

其中存儲(chǔ)類型與一般函數(shù)相同,分為extern型和static型?!皵?shù)據(jù)類型*”是指函數(shù)的返回值類型是指針類型,數(shù)據(jù)類型說(shuō)明指針?biāo)赶虻淖兞康臄?shù)據(jù)類型。存儲(chǔ)類型數(shù)據(jù)類型*函數(shù)名(參數(shù)表列) { 函數(shù)體 }5.7指針函數(shù)

例如:

staticfloat*a(intx,inty);

函數(shù)a為靜態(tài)有參函數(shù),返回值是一個(gè)指向float變量的指針。 與一般函數(shù)的定義相比較,指針函數(shù)在定義時(shí)應(yīng)注意以下兩點(diǎn):(1)在函數(shù)名前面要加上一個(gè)“*”號(hào),表示該函數(shù)的返回值是指針類型的;(2)在函數(shù)體內(nèi)必須有return語(yǔ)句,其后跟隨的表達(dá)式結(jié)果值必須是指針類型。5.7指針函數(shù) 2.指針函數(shù)的說(shuō)明 如果函數(shù)定義在后,調(diào)用在前,則在主調(diào)函數(shù)中應(yīng)對(duì)其進(jìn)行說(shuō)明。一般說(shuō)明的形式為:

例如上述函數(shù)a的定義部分放在主調(diào)函數(shù)之后,在主調(diào)函數(shù)中對(duì)函數(shù)a說(shuō)明如下:

float*a(int,int);數(shù)據(jù)類型*函數(shù)名(參數(shù)類型表);5.7指針函數(shù)【例5.23】通過(guò)指針函數(shù),輸入一個(gè)1~7之間的整數(shù),輸出對(duì)應(yīng)的星期名。

#include<stdio.h> #include<stdlib.h> char*day_name(intn) {/*name數(shù)組初始化賦值為八個(gè)字符串,分別表示各個(gè)星期名及出錯(cuò)提示*/staticchar*name[]={"Illegalday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};return((n<1||n>7)?name[0]:name[n]); }

5.7指針函數(shù)voidmain() {inti;printf("inputDayNo:\n");scanf("%d",&i);if(i<0)exit(1);/*調(diào)用stdlib庫(kù)中的exit()退出程序*/printf("DayNo:%2d-->%s\n",i,day_name(i));}5.7指針函數(shù)【例5.24】用指針函數(shù)實(shí)現(xiàn)求兩個(gè)數(shù)中的最小值。

#include"stdio.h"int*min(intx,inty){if(x<y)return(&x);/*x的地址作為指針函數(shù)的返回值*/elsereturn(&y);}int*minp(int*x,int*y){int*q;q=*x<*y?x:y;return(q);/*指針變量q作為指針函數(shù)的返回值*/}

5.7指針函數(shù)voidmain(){inta,b,*p;printf("Pleaseinputtwointegernumbers:");scanf("%d%d",&a,&b);p=min(a,b);

/*返回最小值指針*/printf("\nmin=%d",*p);/*輸出最小值*/p=minp(&a,&b);

/*注意minp的形參類型*/printf("\nminp=%d",*p);/*輸出最小值*/}5.8函數(shù)指針

在C語(yǔ)言中,函數(shù)名表示函數(shù)的入口地址,當(dāng)指針存儲(chǔ)函數(shù)的入口地址時(shí),稱為指向函數(shù)的指針,即函數(shù)指針。函數(shù)指針是函數(shù)體內(nèi)第一個(gè)可執(zhí)行語(yǔ)句的代碼在內(nèi)存中的地址,如果把函數(shù)名賦給一個(gè)函數(shù)指針,則可以利用該指針來(lái)調(diào)用函數(shù)。5.8.1函數(shù)指針的概念 1.函數(shù)指針定義 函數(shù)指針定義形式為:

例如:int(*p)(); 指針變量p為指向一個(gè)返回值為整型的函數(shù)指針。 說(shuō)明:(1)數(shù)據(jù)類型表示指針?biāo)赶蚝瘮?shù)返回值的類型。(2)在該定義的一般形式中,第一對(duì)圓括號(hào)不能省略。因?yàn)閳A括號(hào)的優(yōu)先級(jí)高于“*”的優(yōu)先級(jí),則指針變量名就會(huì)先與后面的一對(duì)圓括號(hào)結(jié)合,那么該定義形式就成為定義一個(gè)函數(shù),函數(shù)返回值的類型為指針類型。數(shù)據(jù)類型(*指針變量名)();5.8.1函數(shù)指針的概念 【例5.25】通過(guò)指針變量訪問(wèn)函數(shù),實(shí)現(xiàn)求兩個(gè)數(shù)中的最大數(shù)。

#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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論