




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第10章函數(shù)參數(shù)傳遞進(jìn)階函數(shù)的參數(shù)不僅可以是整型、實(shí)型、字符型等數(shù)據(jù),還可以是指針類型數(shù)據(jù)?!纠?0.1】交換兩個(gè)指針變量所指向的變量的值#include"stdio.h"voidtest(int*p1,int*p2)/*形參為指針變量*/{intp;
p=*p1;*p1=*p2;*p2=p;
}main(){inta1=10,a2=20;
int*pa1,*pa2;
pa1=&a1;pa2=&a2;
test(pa1,pa2);/*指針變量作為函數(shù)的實(shí)參*/printf("%d,%d\n",a1,a2);}10.1指針變量作為函數(shù)參數(shù)voidtest(int*p1,int*p2)/*形參為指針變量*/{int*t;
t=p1;p1=p2;p2=t;
}main(){inta1=10,a2=20;
int*pa1,*pa2;
pa1=&a1;pa2=&a2;
test(pa1,pa2);/*指針變量作為函數(shù)的實(shí)參*/printf("%d,%d\n",a1,a2);}沒有改變主調(diào)函數(shù)中變量的值【例】交換兩個(gè)指針變量所指向的變量的值voidtest(int*p1,int*p2)/*形參為指針變量*/{intp;
p=*p1;*p1=*p2;*p2=p;
}main(){inta1=10,a2=20;
int*pa1,*pa2;
pa1=&a1;pa2=&a2;
test(pa1,pa2);/*指針變量作為函數(shù)的實(shí)參*/printf("%d,%d\n",a1,a2);}inta[2]={10,20};test(a);voidtest(int*p){intt;t=*p;*p=*(p+1);*(p+1)=t;}10.2數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)對于數(shù)組來說,數(shù)組名、數(shù)組指針變量以及數(shù)組元素的指針均為指針類型數(shù)據(jù),當(dāng)它們作為函數(shù)的實(shí)參時(shí),相應(yīng)的形參應(yīng)為同類型的指針變量。main(){inta[20];
func(a,20);
}func(int*b,intn){
}main(){inta[20],*pa=a;
func(pa,20);
}func(int*b,intn){
}intb[]【例9.8】利用選擇法將數(shù)組中的n個(gè)整數(shù)由小到大排序。#include"stdio.h"main(){int[6]={10,4,12,34,2,56};inti;voidsort(int*b,intn);sort(a,6); for(i=0;i<6;i++) printf("%4d",a[i]);printf("\n");}voidsort(int*b,intn) {inti,j,k,t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)
if(*(b+j)<*(b+k))k=j;
t=*(b+i);*(b+i)=*(b+k);*(b+k)=t;
}}
歸納起來,如果有一個(gè)實(shí)參數(shù)組,想通過函數(shù)調(diào)用改變此數(shù)組元素的值,實(shí)參與形參的對應(yīng)關(guān)系有以下4種等價(jià)形式:
形參和實(shí)參都用數(shù)組名;
實(shí)參用數(shù)組名,形參用數(shù)組指針變量;
實(shí)參形參都用數(shù)組指針變量;
實(shí)參為數(shù)組指針變量,形參為數(shù)組名?!纠恳阎嘲?位學(xué)生5門課的成績,計(jì)算總平均分?jǐn)?shù),并輸出某個(gè)學(xué)生各門課的成績。二維數(shù)組的指針作函數(shù)實(shí)參時(shí),有列指針和行指針兩種形式。相應(yīng)的,用來接受實(shí)參數(shù)組指針的形參,必須使用相應(yīng)形式的指針變量,如下所示:(1)實(shí)參用列指針,形參用(列)指針變量。(2)實(shí)參用行指針,形參用行指針變量。10.3行數(shù)組指針變量作函數(shù)參數(shù)#include"stdio.h"main(){voidaverage(float*ap,intn,intk); /*函數(shù)的聲明*/voidsearch(float(*p)[6],intn,intm); /*函數(shù)的聲明*/floatcj[4][6]={{3,65,67,70,60,55},{6,80,87,90,81,94},{7,90,96,100,98,92},{9,77,69,73,80,90}};average(&cj[0][0],4,5);/*求4個(gè)學(xué)生5門課程的平均成績*/search(cj,4,7); /*查找學(xué)號為7的學(xué)生成績*/}voidaverage(float*ap,intn,intk)/*函數(shù)的定義,形參ap為列指針變量*/{inti;floatsum=0,ave;for(i=0;i<n*(k+1);i++,ap++)if(i%(k+1))/*跳過學(xué)號*/sum=sum+(*ap);ave=sum/(n*k);printf("average=%6.2f\n",ave);}voidsearch(float(*p)[6],intn,intm) /*函數(shù)的定義,形參p為行指針變量*/{inti,j;for(i=0;i<n;i++)if(**(p+i)==m){printf("ThescoresofNo%dstudentare:\n",m);for(j=1;j<6;j++)printf("%6.1f",*(*(p+i)+j));}printf("\n");}
將一個(gè)字符串從一個(gè)函數(shù)傳遞到另一個(gè)函數(shù),只需要傳遞字符串的首地址。這時(shí)實(shí)參為字符串首地址,對應(yīng)的形參應(yīng)為字符型指針變量(也可以寫成字符型數(shù)組的定義形式)。10.4字符型指針變量作函數(shù)參數(shù)【例】編寫程序通過調(diào)用字符串拷貝函數(shù)來實(shí)現(xiàn)字符串的復(fù)制。(1)形參用字符數(shù)組作參數(shù)#include"stdio.h“main(){voidscopy(chara[],charb[]);chars1[]="IloveChina.";chars2[]="IloveBeijing.";printf("s1:%s\ns2:%s\n",s1,s2);scopy(s1,s2);printf("s1:%s\ns2:%s\n",s1,s2);}voidscopy(chara[],charb[]){inti;for(i=0;a[i]!='\0';i++)b[i]=a[i];b[i]='\0';}【例】編寫程序通過調(diào)用字符串拷貝函數(shù)來實(shí)現(xiàn)字符串的復(fù)制。(2)形參用字符指針變量voidscopy(char*p1,char*p2){inti;
for(;*p1!='\0';p1++,p2++)*p2=*p1;
*p2='\0';}歸納起來,作為函數(shù)參數(shù),有以下幾種情況:(1)形參和實(shí)參都用數(shù)組名。(2)實(shí)參用數(shù)組名,形參用字符指針變量。(3)實(shí)參形參都用字符指針變量。(4)實(shí)參用字符指針變量,形參為數(shù)組名。1.指針函數(shù)的定義和調(diào)用一個(gè)函數(shù)可以返回一個(gè)int型、float型、char型的數(shù)據(jù),也可以返回一個(gè)指針類型的數(shù)據(jù)。返回指針值的函數(shù)稱為指針函數(shù)。定義指針函數(shù)的一般形式為: 類型標(biāo)識符*函數(shù)名(參數(shù)表)例如:
int*pfun(floatx,floaty)10.5指向函數(shù)的指針變量作為函數(shù)參數(shù)【例9.5】下列程序是通過指針函數(shù),輸入一個(gè)1~7之間的整數(shù),輸出對應(yīng)的星期名。#include"stdio.h"main(){inti;char*day_name(intn);/*指針函數(shù)的聲明*/printf("inputDayNo:");scanf("%d",&i);if(i<0)exit(1);printf("DayNo:%2d-->%s\n",i,day_name(i));}char*day_name(intn)/*指針函數(shù)的定義*/{char*name[]={"Illegalday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};return((n<1||n>7)?name[0]:name[n]);}
定義指向函數(shù)的指針變量的一般形式為: 類型標(biāo)識符(*指針變量名)();“類型標(biāo)識符”是指函數(shù)返回值的類型。例如:
int(*pf)();注意,(*pf)兩側(cè)的括弧是必需的。函數(shù)名代表該函數(shù)的入口地址。因此,可用函數(shù)名給指向函數(shù)的指針變量賦值。格式為:
指向函數(shù)的指針變量=函數(shù)名;例如: pf=fun;2.指向函數(shù)指針變量的定義和賦值給函數(shù)指針賦值后,就可以引用它了。函數(shù)的調(diào)用可以通過函數(shù)名調(diào)用,也可以通過指向函數(shù)的指針變量調(diào)用。
用函數(shù)名調(diào)用的一般形式為: 函數(shù)名(實(shí)參表);用指向函數(shù)的指針變量調(diào)用的一般形式為:
(*指針變量名)(實(shí)參表);【例】使用指向函數(shù)的指針變量調(diào)用函數(shù)。#include"stdio.h"main(){intadd(inta,intb),(*pf)();
intx,y,z;
pf=add;/*pf指向函數(shù)add*/printf("Inputx,y:");
scanf("%d,%d",&x,&y);
z=(*pf)(x,y);/*調(diào)用函數(shù)add*/printf("x=%d,y=%d,sum=%d\n",x,y,z);}intadd(inta,intb){return(a+b);}
指向函數(shù)的指針變量也可以作為函數(shù)的參數(shù);即將函數(shù)的入口地址傳遞給函數(shù),也就是將函數(shù)名傳給形參,從而實(shí)現(xiàn)利用相同的函數(shù)調(diào)用語句調(diào)用不同函數(shù)的目的。【例】用函數(shù)指針變量實(shí)現(xiàn)四則運(yùn)算。3.指向函數(shù)指針變量作函數(shù)參數(shù)#include"stdio.h"doubleadd(doublex,doubley){return(x+y);}doublesub(doublex,doubley){return(x-y);}doublemult(doublex,doubley){return(x*y);}doubledivi(doublex,doubley){return(x/y);}doubleresult(doublex,doubley,double(*pf)(double,double)){doubles;s=(*pf)(x,y);return(s);}main(){doublea,b,s;charop;printf("pleaseselectyouroperation(input+,,*or/)\n");scanf("%c",&op);printf("pleaseinputthetwooperand\n");scanf("%lf,%lf",&a,&b);switch(op){ case'+':s=result(a,b,add);break; case'':s=result(a,b,sub);break; case'*':s=result(a,b,mult);break; case'/':s=result(a,b,divi);break;}printf("theoperationis:%lf%c%lf=%lf\n",a,op,b,s);}主函數(shù)的原形如下:main(intargc,char*argv[]){…}
其中,argc和argv就是main()函數(shù)的形參。argc是整形變量,argv[]是一個(gè)字符型指針數(shù)組。main()函數(shù)是由操作系統(tǒng)調(diào)用的,它的參數(shù)由操作系統(tǒng)傳遞,所以運(yùn)行帶形參的主函數(shù)時(shí),必須在操作系統(tǒng)命令狀態(tài)下,輸入命令行:命令名參數(shù)1參數(shù)2…
參數(shù)n10.6main()函數(shù)的形參
當(dāng)操作系統(tǒng)調(diào)用main()函數(shù)時(shí),將命令行中的命令名
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 創(chuàng)業(yè)合伙人分紅合同范本
- 農(nóng)村燃?xì)獍惭b合同范本
- 企業(yè)常用合同范本庫
- 別墅精裝修包工合同范本
- 勞動合同范本(社保)
- 勞動保密合同范例
- 北辰區(qū)勞務(wù)派遣合同范本
- 農(nóng)村鄰里土地糾紛合同范本
- 加工定做設(shè)備合同范本
- 勞動咨詢合同范本
- 企業(yè)級軟件開發(fā)作業(yè)指導(dǎo)書
- 《中國古代文學(xué)史及作品選II》教學(xué)大綱
- 代工生產(chǎn)合同范本
- 瑜伽課程合同轉(zhuǎn)讓協(xié)議書范本
- 個(gè)人經(jīng)營性貸款合同模板
- 人教版英語2025七年級下冊 Unit1Animal Friends教師版 語法講解+練習(xí)
- DeepSeek新手入門教程
- 課件:《教育強(qiáng)國建設(shè)規(guī)劃綱要(2024-2035年)》學(xué)習(xí)宣講
- 2025年山東化工職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試近5年常考版參考題庫含答案解析
- 2025年全國幼兒園教師資格證考試教育理論知識押題試題庫及答案(共九套)
- 2024年鄭州電力高等專科學(xué)校高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
評論
0/150
提交評論