C++程序設(shè)計與數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):第4章 函數(shù)_第1頁
C++程序設(shè)計與數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):第4章 函數(shù)_第2頁
C++程序設(shè)計與數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):第4章 函數(shù)_第3頁
C++程序設(shè)計與數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):第4章 函數(shù)_第4頁
C++程序設(shè)計與數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):第4章 函數(shù)_第5頁
已閱讀5頁,還剩98頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第一部分第一部分 C+C+結(jié)構(gòu)化程序設(shè)計結(jié)構(gòu)化程序設(shè)計本章內(nèi)容本章內(nèi)容 函數(shù)概述函數(shù)概述 函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用 函數(shù)原型函數(shù)原型 參數(shù)的傳遞機制參數(shù)的傳遞機制 函數(shù)與指針函數(shù)與指針 嵌套調(diào)用和遞歸調(diào)用嵌套調(diào)用和遞歸調(diào)用 函數(shù)參數(shù)的缺省函數(shù)參數(shù)的缺省 函數(shù)重載函數(shù)重載 函數(shù)模板函數(shù)模板 內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù) 系統(tǒng)函數(shù)系統(tǒng)函數(shù) 作用域、生存期與可見性作用域、生存期與可見性 編譯預(yù)處理編譯預(yù)處理 帶參數(shù)的帶參數(shù)的main( ) main( ) 2 2例:求3 31694#include #includevoid main( )double sum; sum=sqrt(4)+sqrt (9)+

2、sqrt (16);coutsum=sumendl;求求 4!+9!+16!l 遇到的問題:遇到的問題:沒有求階乘的庫函數(shù)!沒有求階乘的庫函數(shù)!l 自己動手做函數(shù)自己動手做函數(shù) 函數(shù)應(yīng)該有名字函數(shù)應(yīng)該有名字 函數(shù)有入口(函數(shù)的參數(shù))函數(shù)有入口(函數(shù)的參數(shù)) 函數(shù)有出口(函數(shù)的返回值)函數(shù)有出口(函數(shù)的返回值)4 4sqrt4293164xyxyFact (n )return f;5 5函數(shù)名函數(shù)名函數(shù)的參數(shù)(入口)函數(shù)的參數(shù)(入口) 可以有多個參數(shù)可以有多個參數(shù)函數(shù)的返回值(出口)函數(shù)的返回值(出口) 只能有一個返回值只能有一個返回值double Fact (int n )double f;r

3、eturn f;怎樣實現(xiàn)函數(shù)的功能?怎樣實現(xiàn)函數(shù)的功能?double Fact ( int n )double f=1.0for(int i=1; i=n; i+) f*=i;return f;函數(shù)的返函數(shù)的返回類型回類型#include double Fact( int n )double f=1.0for(int i=1; i=n; i+) f*=i;return f;void main( )double sum; sum=Fact(4)+Fact(9)+Fact(16);cout“4!+9!+16!=sumendl;不使用函數(shù)會怎樣?6 6#include void main( )int

4、 i1, i2, i3;double s, s1, s2, s3; s1=1.0;for(i1=1;i1=4;i1+)s1*=i1;s2=1.0;for(i2=1;i2=9;i2+)s2*=i2;s3=1.0;for(i3=1;i3=16;i2+)s3*=i3;s=s1+s2+s3;#include void main( )int i;double s, s1, s2, s3; s1=1.0;for(i=1;i=4;i+)s1*=i;s2=1.0;for(i=1;i=9;i+)s2*=i;s3=1.0;for(i=1;i=16;i+)s3*=i;s=s1+s2+s3;#include void

5、 main( )int i;double s, s1; s=0;s1=1.0;for(i=1;i=4;i+)s1*=i;s+=s1;s1=1.0;for(i=1;i=9;i+) s1*=i;s+=s1;s1=1.0;for(i=1;i=16;i+) s1*=i;s+=s1;#include void main( )int i, j;int a3=4,9,16;double sum=0, temp; for(i=0; i3; i+)temp=1.0for(j=1; j=ai; j+) temp*=j;sum+=temp;cout“4!+9!+16!=sumendl;#include double

6、 Fact( int n )double f=1.0for(int i=1; i=n; i+) f*=i;return f;void main( )double sum; sum=Fact(4)+Fact(9)+Fact(16);cout“4!+9!+16!=sumendl;討論:使用函數(shù)的好處討論:使用函數(shù)的好處 減少重復(fù)的代碼;減少重復(fù)的代碼; 使用函數(shù)使用函數(shù)“分擔(dān)分擔(dān)”程序的部分功能;程序的部分功能; 使思路更加清晰:使思路更加清晰:程序所有功能可以分解為若干程序所有功能可以分解為若干個不同的函數(shù)完成。個不同的函數(shù)完成。main()是一個是一個“節(jié)目主持節(jié)目主持人人”,作為程序的主干;

7、,作為程序的主干; 可以把編程工作分配給一個可以把編程工作分配給一個team,每人負責(zé)編,每人負責(zé)編寫若干個函數(shù),有一個統(tǒng)一的寫若干個函數(shù),有一個統(tǒng)一的接口;接口; 修改主函數(shù)或某個函數(shù),不影響其它;修改主函數(shù)或某個函數(shù),不影響其它; 可重復(fù)使用!可重復(fù)使用!7 7#include double Factorial(int n)double temp=1.0;if(n=0) return 1.0;for(int i=1;i=n;i+)temp*=i;return temp;void main( )double s;s=Factorial(6)+Factorial (17)+Factorial

8、(20);cout6!+17!+20!=sendl; 函數(shù)的定義函數(shù)的定義函數(shù)的調(diào)用函數(shù)的調(diào)用函數(shù)的首部函數(shù)返回值的類型函數(shù)名形參的類型和名稱函數(shù)體內(nèi)部變量說明部分可執(zhí)行語句部分兩種形式兩種形式作為表達式一部分作為表達式一部分語句調(diào)用語句調(diào)用實參實參函數(shù)原型函數(shù)原型與變量一樣,函數(shù)也需要先聲明后使用。如果函數(shù)的調(diào)用在定義之前,則需要有函數(shù)原型。形式上,函數(shù)原型與函數(shù)定義的頭部相同。8 8#include double Factorial(int x);/函數(shù)原型函數(shù)原型void main( )double s;s=Factorial (6)+Factorial (17)+Factorial (

9、20);cout6!+17!+20!=sendl; double Factorial(int n)double temp=1.0;if(n=0) return 1.0;for(int i=1; i=n; i+) temp*=i;return temp;C+語言源程序的特點語言源程序的特點l 源程序構(gòu)成:源程序構(gòu)成:一個一個C+源程序由一個主函數(shù)和若源程序由一個主函數(shù)和若干個相關(guān)的子函數(shù)組成。干個相關(guān)的子函數(shù)組成。l 主主函數(shù):函數(shù):總是以總是以main ( )作為開頭,是源程序執(zhí)作為開頭,是源程序執(zhí)行的起點,其結(jié)尾是源程序運行的終點。它是行的起點,其結(jié)尾是源程序運行的終點。它是唯唯一能夠獨立運

10、行一能夠獨立運行的函數(shù),可以位于源程序的前面、的函數(shù),可以位于源程序的前面、中間或者后面。中間或者后面。l 子函數(shù)子函數(shù):是功能獨立和簡單的程序。它的運行需是功能獨立和簡單的程序。它的運行需要函數(shù)間的調(diào)用指令。要函數(shù)間的調(diào)用指令。l 函數(shù)種類:函數(shù)種類:包括用戶自編寫函數(shù)、系統(tǒng)函數(shù)(包括用戶自編寫函數(shù)、系統(tǒng)函數(shù)( 由由C+系統(tǒng)提供)。系統(tǒng)提供)。4.1 函數(shù)概述函數(shù)概述9 94. 2 函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用1. 函數(shù)的定義函數(shù)的定義類型名類型名 函數(shù)名函數(shù)名(形式參數(shù)表)(形式參數(shù)表)語句序列語句序列 定義函數(shù)內(nèi)容:函數(shù)名稱、函數(shù)返值類型、函數(shù)定義函數(shù)內(nèi)容:函數(shù)名稱、函數(shù)返值類型、函

11、數(shù)參數(shù)個數(shù)和類型、以及編寫實現(xiàn)的函數(shù)的功能的語句參數(shù)個數(shù)和類型、以及編寫實現(xiàn)的函數(shù)的功能的語句函數(shù)定義的一般形式為:函數(shù)定義的一般形式為:1010函數(shù)定義各部分的含義函數(shù)定義各部分的含義 函數(shù)名:函數(shù)名:函數(shù)命名與變量名命名方法相同。作為一函數(shù)命名與變量名命名方法相同。作為一種種標(biāo)識符標(biāo)識符,函數(shù)名命名最好反映該函數(shù)的功能,做,函數(shù)名命名最好反映該函數(shù)的功能,做到到“見名知意見名知意”。如用。如用factorial好于好于F。 形式參數(shù)表:形式參數(shù)表:用圓括號括起來;參數(shù)間用逗號隔開;用圓括號括起來;參數(shù)間用逗號隔開;必須指明類型。若無參數(shù),圓括號內(nèi)什么也不寫或必須指明類型。若無參數(shù),圓括號內(nèi)

12、什么也不寫或?qū)憣憊oid,但圓括號本身不能省略。,但圓括號本身不能省略。 類型名:類型名:實際是實際是返回值返回值的數(shù)據(jù)類型??梢允腔緮?shù)的數(shù)據(jù)類型??梢允腔緮?shù)據(jù)類型、構(gòu)造數(shù)據(jù)類型、據(jù)類型、構(gòu)造數(shù)據(jù)類型、指針或引用指針或引用。 return語語句實現(xiàn)函數(shù)的返值功能。句實現(xiàn)函數(shù)的返值功能。如果一個函數(shù)沒有返回值,如果一個函數(shù)沒有返回值,返回值類型標(biāo)記為返回值類型標(biāo)記為void。如果定義時沒指定類型,如果定義時沒指定類型,則默認的類型是則默認的類型是int型(注意不是型(注意不是void型)。型)。1111 花括號:花括號:花括號內(nèi)是各種語句組成的函數(shù)體,花括號內(nèi)是各種語句組成的函數(shù)體,函數(shù)是程

13、序運行的基本單位。函數(shù)的定義不可以嵌函數(shù)是程序運行的基本單位。函數(shù)的定義不可以嵌套,套,即函數(shù)體內(nèi)不允許定義另一個函數(shù)。即函數(shù)體內(nèi)不允許定義另一個函數(shù)。 return語句:語句:return 表達式;表達式;可以沒有表達式,可以沒有表達式,只一個只一個return(此時可以省略);如果沒有(此時可以省略);如果沒有return語句,函數(shù)執(zhí)行至語句,函數(shù)執(zhí)行至“”返回。函數(shù)內(nèi)可以多個返回。函數(shù)內(nèi)可以多個return語句,注意函數(shù)的返回值只能有一個。語句,注意函數(shù)的返回值只能有一個。/P79,例,例4.2:沒有形參和返回值的函數(shù):沒有形參和返回值的函數(shù)注意 函數(shù)返回值是void,只能用語句方式調(diào)用

14、。 函數(shù)返回值是int(缺省)或其它,如果沒有return語句,則可能返回一個任意的數(shù)。 當(dāng)函數(shù)有返回值,如果不關(guān)心返回值是多少,也可以用語句方式調(diào)用。 當(dāng)函數(shù)作為表達式時,表達式的值就是函數(shù)的返回值1212void alphabet() cout“abcdefgn”; main() alphabet();void alphabet() cout“abcdefgn”;return;/可以沒有可以沒有return語句語句main() int x;x=alphabet();coutxendl; /不能以表達式方式調(diào)用不能以表達式方式調(diào)用alphabet() /int alphabet() cout

15、“abcdefgn”;return 1;main() int x;x=alphabet();coutxendl; /輸出輸出1alphabet()cout“abcdefgn”;main() int x;x=alphabet();coutxendl; /x的值其實沒有意義的值其實沒有意義alphabet()cout“abcdefgn”;main() int dummy;dummy=alphabet();alphabet();/兩種調(diào)用方法都可以兩種調(diào)用方法都可以1313/P79,例,例4.1:定義求:定義求xn的函數(shù)的函數(shù)#includelong power(int x, int n) long

16、 p=1;/注意類型的一致注意類型的一致for(int i=1; i=n; i+) p=p*x;return p;main() long x;double y;x=power(3,4);/類型一致類型一致y=power(3, 2.5); /沒有得到?jīng)]有得到3的的2.5次方次方coutx=x,y=yendl;1414/求求xy,(x、y可以輸入)可以輸入)#includepower(int x, int n)int p=1;for(int i=1; ixy;z=power(x, y);/類型一致類型一致cout“z=zendl;/求求xy (x、y可以輸入)可以輸入)#includepower(

17、int x, int n)int p=1;for(int i=1; ixy;cout“z= power(x, y) endl;/不成功的例子不成功的例子#includepower(int x, int n) int p=1; cinxn;for(int i=1; i=n; i+) p=p*x;cout“p=”pendl;main()int x, y, z;x=3; y=4;z= power(x, y);cout“z=zendl;/成功但不好的例子成功但不好的例子#includepower() /不能寫成:不能寫成:power(int x, int n) int x, n;int p=1; ci

18、nxn;for(int i=1; i=n; i+) p=p*x;cout“z=”pendl;main()power();/函數(shù)的形參與函數(shù)內(nèi)部的局部變量有什么不同?函數(shù)的形參與函數(shù)內(nèi)部的局部變量有什么不同?/P80,例,例4.3:有多個:有多個return語句函數(shù)語句函數(shù)#includemax(int a1, int a2)/函數(shù)類型函數(shù)類型int可以省略可以省略 /返回返回a1、a2中大的數(shù)中大的數(shù)if(a1a2)return a1;elsereturn a2;void main()coutmax(3, 4)endl;coutmax(9, 8)endl; /返回語句可以有多個,但返回值只能有

19、一個!返回語句可以有多個,但返回值只能有一個!15152. 函數(shù)的調(diào)用函數(shù)的調(diào)用是指在一個函數(shù)執(zhí)行中間,轉(zhuǎn)去執(zhí)行其他函數(shù)的過程。子函數(shù)一經(jīng)定義,就可以被main()主函數(shù)、其他函數(shù)、甚至該子函數(shù)自身多次調(diào)用。函數(shù)調(diào)用形式為:函數(shù)調(diào)用形式為: 函數(shù)名函數(shù)名(實參表)(實參表);注意實參與形參在注意實參與形參在數(shù)量數(shù)量、類型類型、位置位置上的一致性上的一致性long F(int x, double y, bool z)/定義定義main()long u;u=F(3, 2.5, true);/調(diào)用調(diào)用1616#include double F(int x, double y, bool z)cout

20、x=xendl;couty=yendl;coutz=zendl;return 1.5;void main()long u=F(3.5, 2, 6);coutu=uendl;1717函數(shù)調(diào)用的嵌套函數(shù)調(diào)用的嵌套 函數(shù)可以反復(fù)調(diào)用。 函數(shù)的定義不可以嵌套,但是函數(shù)的調(diào)用可以嵌套。void main() int x, i;coutx;for(i=1; i=10; i+)coutpower(x,i)endl;long m=power(power(x, 2), 3);coutmendl; /如果如果x=2, 則則m=6418184. 3 函數(shù)原型函數(shù)原型l函數(shù)原形的一般形式:函數(shù)原形的一般形式:類型名類

21、型名 函數(shù)名函數(shù)名(形參表);(形參表);l用途:事先聲明某函數(shù)的存在。即當(dāng)調(diào)用用途:事先聲明某函數(shù)的存在。即當(dāng)調(diào)用函數(shù)語句出現(xiàn)在被調(diào)用函數(shù)定義之前的時函數(shù)語句出現(xiàn)在被調(diào)用函數(shù)定義之前的時候,必須事先對該被調(diào)用函數(shù)進行原型說候,必須事先對該被調(diào)用函數(shù)進行原型說明。明。 調(diào)用在前,定義在后,需要聲明。調(diào)用在前,定義在后,需要聲明。 定義在前,調(diào)用在后,可以沒有聲明,首部兼定義在前,調(diào)用在后,可以沒有聲明,首部兼做聲明的作用。做聲明的作用。l 函數(shù)原型即函數(shù)定義的第一行的內(nèi)容,后函數(shù)原型即函數(shù)定義的第一行的內(nèi)容,后面加上面加上“;”(分號分號)。 1919舉例,P80,例4.4:求35#inclu

22、de int power(int x, int n)int i, p=1; for(i=1; i=n; i+) p=p*x; return p;void main()int x, s; coutx;s=power(x, 3)+power(x, 5);couts=sendl;#include int power(int x, int n);/函數(shù)原形函數(shù)原形 void main()int x, s; coutx;s=power(x, 3)+power(x, 5);couts=sendl;int power(int x, int n)int i, p=1; for(i=1; i=n; i+) p=

23、p*x; return p;#include int power(int a, int b);void main()int x, s; coutx;s=power(x, 3)+power(x, 5);couts=sendl;int power(int x, int n)int i, p=1; for(i=1; i=n; i+) p=p*x; return p;#include int power(int, int);void main()int x, s; coutx;s=power(x, 3)+power(x, 5);couts=sendl;int power(int x, int n)in

24、t i, p=1; for(i=1; i=n; i+) p=p*x; return p;#include int power(int, int);int power(int x, int n)int i, p=1; for(i=1; i=n; i+) p=p*x; return p;void main()int x, s; coutx;s=power(x, 3)+power(x, 5);couts=sendl;2020 函數(shù)原型舉例,P82,例4.6#include f1(); /原型,標(biāo)準(zhǔn)寫法:原型,標(biāo)準(zhǔn)寫法:int f1(void);void main() coutthis is main

25、()n; /f1(); 與下邊的調(diào)用有什么區(qū)別?與下邊的調(diào)用有什么區(qū)別? coutf1()endl; int f1(void) /int和和void都可以省略都可以省略 f1() coutthis is f1()n; return 1; int f2(void) coutthis is f2()n; return 2;int f3(void) coutthis is f3()n; coutf2()endl; return 3;#include /原型原型int f1(), f2(), f3();void main() coutthis is main()n; coutf1()endl; int

26、 f1(void) coutthis is f1()n; coutf3()endl; return 1; 輸出:輸出:this is main()this is f1()this is f3()this is f2()23121214. 4 參數(shù)傳遞機制參數(shù)傳遞機制l 用實參去替換形參的過程稱作參數(shù)傳遞。用實參去替換形參的過程稱作參數(shù)傳遞。l 當(dāng)一個函數(shù)被調(diào)用時,系統(tǒng)會給該函數(shù)的形參分配當(dāng)一個函數(shù)被調(diào)用時,系統(tǒng)會給該函數(shù)的形參分配存儲空間,同時要求提供與形參的類型、個數(shù)存儲空間,同時要求提供與形參的類型、個數(shù)一致一致的實參。的實參。 #include int MyAdd(int x, int

27、y) return 2*x+3*y;void main() coutMyAdd(3, 4)endl;#include int MyAdd(int x, int y) return 2*x+3*y;void main() int x=3, y=4;coutMyAdd(x, y)endl;#include int MyAdd(int x, int y) return 2*x+3*y;void main() int x=3, y=4;coutMyAdd(y, x)endl;2222l 數(shù)值傳遞機制(傳值方式)數(shù)值傳遞機制(傳值方式) 將各個實參的值將各個實參的值 按位置先后順序按位置先后順序 拷貝(

28、傳遞)拷貝(傳遞)給與之對應(yīng)的各個形參。傳遞后的形參與對應(yīng)的給與之對應(yīng)的各個形參。傳遞后的形參與對應(yīng)的實參雖然數(shù)值相同,但卻是不同的變量。實參雖然數(shù)值相同,但卻是不同的變量。 P83,例,例4.7 將兩個變量的內(nèi)容交換將兩個變量的內(nèi)容交換#include void swap(int x, int y)int temp; temp=x; x=y; y=temp;void main() int a(15), b(18);swap (a, b); cout“調(diào)用調(diào)用swap的輸出的輸出: a=”a“,b=bendl; 調(diào)用swap的輸出: a=15,b18#include void swap(int

29、 x, int y); /函數(shù)原型函數(shù)原型void main() int a(15), b(18); cout“調(diào)用調(diào)用swap前的輸出前的輸出: a=”a“,b=bendl; swap (a, b);cout“調(diào)用調(diào)用swap的輸出的輸出: a=”a“,b=bendl; void swap(int x, int y) int temp; cout“交換前的輸出交換前的輸出: x=”x“,y=yendl; temp=x; x=y; y=temp; cout“swap函數(shù)輸出函數(shù)輸出: x=”x“,y=yendl; 調(diào)用調(diào)用swap前的輸出前的輸出: a=15,b=18交換前的輸出:交換前的輸出

30、:x=15,y=18swap函數(shù)的輸出:函數(shù)的輸出:x=18,y=15調(diào)用調(diào)用swap的輸出的輸出: a=15,b=182323l 傳地址調(diào)用機制傳地址調(diào)用機制 形參是一個形參是一個指針,指針,實參傳遞的是地址。實參傳遞的是地址。 /P84例例4.8#include void swap(int *x, int *y); /函數(shù)原型函數(shù)原型void main() int a(15), b(18); cout“調(diào)用調(diào)用swap前的輸出前的輸出: a=”a“,b=bendl; swap (&a, &b); cout“調(diào)用調(diào)用swap的輸出的輸出: a=”a“,b=bendl; voi

31、d swap(int *x, int *y) int temp; cout“交換前的輸出交換前的輸出: *x=”*x“,*y=*yendl; temp=*x; *x=*y; *y=temp; cout“swap函數(shù)輸出函數(shù)輸出: *x=”*x“,*y=*yendl; 調(diào)用調(diào)用swap前的輸出前的輸出: a=15,b=18交換前的輸出:交換前的輸出:*x=15,*y=18swap函數(shù)的輸出:函數(shù)的輸出:*x=18,*y=15調(diào)用調(diào)用swap的輸出的輸出: a=18,b=152424傳地址方式的一個典型應(yīng)用傳地址方式的一個典型應(yīng)用 使用傳地址的方式可以使函數(shù)得到使用傳地址的方式可以使函數(shù)得到不止不

32、止一一個個返回值。返回值。 例:求解方程例:求解方程ax2+bx+c=0#include #includefun (double, double, double, double *, double *);main()double a, b, c, x1, x2;cinabc;if(fun(a, b, c, &x1, &x2)cout“x1=“x1“, x2=“x2endl;elsecout“無實數(shù)根n”;fun (double a, double b, double c, double *x1, double *x2)double t;t=b*b-4*a*c;if(t0)ret

33、urn 0;else t=sqrt(t);*x1=(-b+t)/(2*a); *x2=(-b+t)/(2*a);return 1; 2525l 函數(shù)的引用調(diào)用函數(shù)的引用調(diào)用 引用是給已知變量起個別名。引用是給已知變量起個別名。 引用作形參時,可以被認為是實參的一個引用作形參時,可以被認為是實參的一個別名,別名,傳遞后形參和實參實際是同一個量傳遞后形參和實參實際是同一個量。對形參的任何操作都直接作用于實參。形對形參的任何操作都直接作用于實參。形參變化,對應(yīng)實參值也發(fā)生了變化。參變化,對應(yīng)實參值也發(fā)生了變化。 引用調(diào)用與傳地址調(diào)用的效果是一樣的,引用調(diào)用與傳地址調(diào)用的效果是一樣的,但它比傳地址調(diào)用

34、更方便、直觀。但它比傳地址調(diào)用更方便、直觀。/P85例例4.9#include void swap(int &x, int &y); /函數(shù)原型函數(shù)原型void main() int a=15,b=18; cout主函數(shù)第主函數(shù)第1次輸出次輸出:“; couta=a“, b=bendl; swap(a, b); cout主函數(shù)第主函數(shù)第2次輸出次輸出: ;couta=a“, b=bendl;void swap(int &x, int &y) int temp; temp=x; x=y; y=temp;2626#include void F1(int &x

35、, int &y) x*=x;y*=2;void main() int x=3, y=4;F1(x, y);cout“x=”x“, y=”yendl;x=9,y=8#include void F1(int &y, int &x) x*=x;y*=2;void main() int x=3, y=4;F1(x, y);cout“x=”x“, y=”yendl;x=6,y=162727參數(shù)傳遞方式小結(jié)參數(shù)傳遞方式小結(jié)l 值的傳遞(值的傳遞(passing by value)數(shù)值傳遞機制:數(shù)值傳遞機制:形參是變量,實參也是變量或形參是變量,實參也是變量或常數(shù)(或表達式),調(diào)用

36、中行參發(fā)生改變,不常數(shù)(或表達式),調(diào)用中行參發(fā)生改變,不影響實參原來的值。影響實參原來的值。地址傳遞機制:地址傳遞機制:形參是指針,實參是地址。形形參是指針,實參是地址。形參改變,實參相應(yīng)改變。參改變,實參相應(yīng)改變。l 引用傳遞(引用傳遞(passing by reference)形參是引用(別名),實參是變量。實參和形形參是引用(別名),實參是變量。實參和形參實際是同一變量。形參改變,實參改變。參實際是同一變量。形參改變,實參改變。引用與引用與傳地址傳地址更加接近。更加接近。更加方便、直觀和安全更加方便、直觀和安全2828l 函數(shù)的參數(shù)是數(shù)組函數(shù)的參數(shù)是數(shù)組 形參是一個指向數(shù)組的指針,實參

37、是形參是一個指向數(shù)組的指針,實參是數(shù)組的首地址。數(shù)組的首地址。l 函數(shù)的返回值是數(shù)組函數(shù)的返回值是數(shù)組 一般返回一個指針即可一般返回一個指針即可數(shù)組與函數(shù)的關(guān)系數(shù)組與函數(shù)的關(guān)系2929數(shù)組作為函數(shù)的參數(shù)數(shù)組作為函數(shù)的參數(shù)當(dāng)數(shù)組整體作為函數(shù)的參數(shù)時,當(dāng)數(shù)組整體作為函數(shù)的參數(shù)時,采用傳地址采用傳地址的方法,避免了成批數(shù)據(jù)在形參和實參之間的方法,避免了成批數(shù)據(jù)在形參和實參之間進行復(fù)制。進行復(fù)制。地址可以用數(shù)組名,也可以用指向數(shù)組的指地址可以用數(shù)組名,也可以用指向數(shù)組的指針。針。例子:例子:P86,例,例4.10,數(shù)組排序,數(shù)組排序#include void sort (int *a); /函數(shù)原型函

38、數(shù)原型void main()int s10=2,3,5,1,7,9,0,4,8,6;sort(s);/實參是數(shù)組名,即數(shù)組地址實參是數(shù)組名,即數(shù)組地址for(int i=0; i10; i+) coutsi ;coutendl; void sort(int *a) /形參是指針形參是指針int temp;for(int i=0; i9; i+)for(int j=i+1; jaj)/*(a+i) temp=ai; ai=aj; aj=temp; #include void sort (int a10); /函數(shù)原型函數(shù)原型void main()int s10=2,3,5,1,7,9,0,4,8

39、,6;sort(s); /實參是地址實參是地址for(int i=0; i10; i+) coutsi ;coutendl; void sort(int a10)/形參形參形式上形式上是一個數(shù)組是一個數(shù)組int temp;for(int i=0; i9; i+)for(int j=i+1; jaj) temp=ai; ai=aj; aj=temp; #include void sort (int a);void main()int s10=2,3,5,1,7,9,0,4,8,6;sort(s); /實參是數(shù)組實參是數(shù)組for(int i=0; i10; i+) coutsi ;coutendl

40、;void sort(int a)/ 形參是數(shù)組形式形參是數(shù)組形式int temp;for(int i=0; i9; i+)for(int j=i+1; jaj) temp=ai; ai=aj; aj=temp; #include void sort (int a50);void main()int s10=2,3,5,1,7,9,0,4,8,6;sort(s); /實參是數(shù)組實參是數(shù)組for(int i=0; i10; i+) coutsi ;coutendl;void sort(int a100)/ 形參是數(shù)組形式形參是數(shù)組形式int temp;for(int i=0; i9; i+)fo

41、r(int j=i+1; jaj) temp=ai; ai=aj; aj=temp; #include void sort (int *a);void main()int s10=2,3,5,1,7,9,0,4,8,6;int *p=s;sort(p); /實參是指針?biāo)4娴牡刂穼崊⑹侵羔標(biāo)4娴牡刂穎or(int i=0; i10; i+) coutsi ;coutendl; void sort(int *a) /形參是指針形參是指針int temp;for(int i=0; i9; i+)for(int j=i+1; jaj) temp=ai; ai=aj; aj=temp; #inclu

42、de void sort (int *a); /原型和定義原型和定義看起來看起來不一樣不一樣void main()int s10=2,3,5,1,7,9,0,4,8,6;int *p=s;sort(p); /實參是指針?biāo)4娴牡刂穼崊⑹侵羔標(biāo)4娴牡刂穎or(int i=0; i10; i+) coutsi ;coutendl; void sort(int a) /形參是數(shù)組形式形參是數(shù)組形式int temp;for(int i=0; i9; i+)for(int j=i+1; jaj) temp=ai; ai=aj; aj=temp; 3030/ P87例例4.11#include void

43、 fun (int *p); /函數(shù)原型函數(shù)原型void main( )int a =2,4,6,8,10 ; fun(a); /調(diào)調(diào)fun()函數(shù)函數(shù) for(int i=0; i5; i+) coutai ; cout=p; q-, p+ ) t=*q; *q=*p; *p=t; 3131二維數(shù)組作參數(shù)二維數(shù)組作參數(shù)l二維數(shù)組作函數(shù)參數(shù)時,二維數(shù)組作函數(shù)參數(shù)時,形參形參可以使用二維可以使用二維數(shù)組指針的各種等價形式:數(shù)組指針的各種等價形式: 二維數(shù)組:二維數(shù)組:x行數(shù)行數(shù)列數(shù)列數(shù) 省略行數(shù)的二維數(shù)組省略行數(shù)的二維數(shù)組x 列數(shù)列數(shù) 指針指針*pf 行指針行指針 (*px) 指針數(shù)組指針數(shù)組*

44、py 指針的指針指針的指針*pl二維數(shù)組作參數(shù)時,采用的是傳地址方式。二維數(shù)組作參數(shù)時,采用的是傳地址方式。3232P87,例,例4.12:求二維數(shù)組中每行元:求二維數(shù)組中每行元素的最大值及最大值所在列的位置。素的最大值及最大值所在列的位置。#include const int N= 5;void fmax(int (*p)N); /函數(shù)原型,函數(shù)原型,行指針作形參行指針作形參void main( ) int aNN=0, 0,-5,3,6,12, 1,-1,9,7,0, 0,1,3,-5,8, 0,1,-1,-2,0; fmax(a); /調(diào)調(diào)fmax( )函數(shù),函數(shù),數(shù)組名作實參數(shù)組名作實

45、參void fmax (int (*p)N) int i, j, r=0, c=0, hmax;for(i=0; iN; i+)hmax=*(*(p+i)+0); /pi0 for (j=0; jhmax)/pij hmax=*(*(p+i)+j); r=i; c=j; coutr c ;coutmax=hmaxendl; #include const int N= 5;void fmax(int *pN); /指針數(shù)組作形參指針數(shù)組作形參void main( ) int aNN=0, 0,-5,3,6,12, 1,-1,9,7,0, 0,1,3,-5,8, 0,1,-1,-2,0;int *

46、p= a0, a1, a2, a3, aN-1; fmax(p); /調(diào)調(diào)fmax( )函數(shù),函數(shù),指針數(shù)組名作實參指針數(shù)組名作實參void fmax (int *pN) int i, j, r=0, c=0, hmax;for(i=0; iN; i+)hmax=pi0; for (j=0; jhmax) hmax=pij; r=i; c=j; coutr c ;coutmax=hmaxendl; #include const int N= 5;void fmax(int *p); /指針的指針作形參指針的指針作形參void main( ) int aNN=0, 0,-5,3,6,12, 1,

47、-1,9,7,0, 0,1,3,-5,8, 0,1,-1,-2,0;int *q= a0, a1, a2, a3, aN-1; fmax(q); /調(diào)調(diào)fmax( )函數(shù),函數(shù),指針數(shù)組名作實參指針數(shù)組名作實參void fmax (int *p) int i, j, r=0, c=0, hmax;for(i=0; iN; i+)hmax=pi0; for (j=0; jhmax) hmax=pij; r=i; c=j; coutr c ;coutmax=hmaxendl; #include const int N= 5;void fmax(int pNN); /數(shù)組作形參,也可以沒有行數(shù)數(shù)組作

48、形參,也可以沒有行數(shù)void main( ) int aNN=0, 0,-5,3,6,12, 1,-1,9,7,0, 0,1,3,-5,8, 0,1,-1,-2,0; fmax(a); /調(diào)調(diào)fmax( )函數(shù),函數(shù),數(shù)組名作實參數(shù)組名作實參void fmax (int pNN) int i, j, r=0, c=0, hmax;for(i=0; iN; i+)hmax=pi0; for (j=0; jhmax)/pij hmax=pij; r=i; c=j; coutr c ;coutmax=hmaxendl; #include const int N= 5;void fmax(int *p

49、); /普通指針作形參普通指針作形參void main()int aNN=0, 0,-5,3,6,12, 1,-1,9,7,0, 0,1,3,-5,8, 0,1,-1,-2,0; fmax(a0); /初始地址作實參初始地址作實參/可不可以寫成可不可以寫成a00?寫成?寫成a呢?呢?void fmax(int *p) int i, j, r=0, c=0, hmax; for(i=0; iN; i+) hmax=*(p+0); for(j=0; jhmax) hmax=*(p+j); r=i; c=j; coutr c max=hmaxendl; p+=N; /修改指針,指向下一行修改指針,指

50、向下一行 33334. 6 函數(shù)與指針函數(shù)與指針 4. 6. 1 函數(shù)返回指針或返回引用函數(shù)返回指針或返回引用 1.指針型函數(shù)指針型函數(shù) 函數(shù)的返回值是一個指針(地址),則稱該函數(shù)為函數(shù)的返回值是一個指針(地址),則稱該函數(shù)為指針函數(shù)。指針函數(shù)主要用在當(dāng)函數(shù)結(jié)束時,需要指針函數(shù)。指針函數(shù)主要用在當(dāng)函數(shù)結(jié)束時,需要大量的數(shù)據(jù)從被調(diào)用函數(shù)返回調(diào)用函數(shù)的情況。大量的數(shù)據(jù)從被調(diào)用函數(shù)返回調(diào)用函數(shù)的情況。指針函數(shù)的定義形式:指針函數(shù)的定義形式:類型類型 *函數(shù)名函數(shù)名(參數(shù)參數(shù)) 3434#include const int N= 5;void fmax(int pN);void main()int a

51、NN=0,0,-5,3,6,12,1,-1,9,7,0, 0,1,3,-5,8,0,1,-1,-2,0;fmax(a);void fmax(int pN)int i, j, hmax;for(i=0; iN; i+)hmax=pi0;for(j=0; jhmax)hmax=pij;coutmax=hmaxendl;#include const int N= 5;int * fmax(int pN);/返回一個指針返回一個指針void main()int aNN=0,0,-5,3,6,12,1,-1,9,7,0, 0,1,3,-5,8,0,1,-1,-2,0;int *b;b=fmax(a);f

52、or(int i=0;iN;i+)coutbiendl;int * fmax(int pN)int i, j;static int hmaxN;for(i=0; iN; i+)hmaxi=pi0;for(j=0; jhmaxi)hmaxi=pij; return hmax;3535返回指針的函數(shù)使用時要注意:返回指針的函數(shù)使用時要注意: 不能把局部作用域內(nèi)數(shù)據(jù)的地址作為不能把局部作用域內(nèi)數(shù)據(jù)的地址作為返回值,因為函數(shù)返回后,函數(shù)的局部變返回值,因為函數(shù)返回后,函數(shù)的局部變量占有的空間被釋放,量占有的空間被釋放,引用已消失空間的引用已消失空間的地址是危險的地址是危險的。因此在因此在fmax( )

53、函數(shù)中將函數(shù)中將字符型指針數(shù)組字符型指針數(shù)組hmax聲明為聲明為static(靜靜態(tài)態(tài)),),這樣在函數(shù)返回后靜態(tài)變量不會消這樣在函數(shù)返回后靜態(tài)變量不會消失,對地址的引用是安全的。失,對地址的引用是安全的。36362. 返回引用返回引用 函數(shù)也可以函數(shù)也可以返回引用返回引用,系統(tǒng)在處理返回引用與,系統(tǒng)在處理返回引用與返回值時是有區(qū)別的:函數(shù)返回值時,系統(tǒng)生成一返回值時是有區(qū)別的:函數(shù)返回值時,系統(tǒng)生成一個返回值的副本(或稱臨時變量),由這個臨時變個返回值的副本(或稱臨時變量),由這個臨時變量給到調(diào)用函數(shù)的接受變量。而返回引用時,不生量給到調(diào)用函數(shù)的接受變量。而返回引用時,不生成副本,直接將引用

54、的值給到調(diào)用函數(shù)。成副本,直接將引用的值給到調(diào)用函數(shù)。 由于引用只是另一個量的別名,因此由于引用只是另一個量的別名,因此返回引用返回引用絕不能返回不在作用域范圍內(nèi)的變量(或?qū)ο螅┑慕^不能返回不在作用域范圍內(nèi)的變量(或?qū)ο螅┑囊靡谩R驗橐粋€變量(或?qū)ο螅┮坏┩顺銎渌诘囊驗橐粋€變量(或?qū)ο螅┮坏┩顺銎渌诘淖饔糜?,對它的任何引用也就毫無意義。作用域,對它的任何引用也就毫無意義。 3737P97,例,例4.16:函數(shù)返回引用函數(shù)返回引用/P92例例4.16#include int &f1(int &a1); /函數(shù)函數(shù)f1( )返回引用返回引用int f2(int a2);vo

55、id main() int x=2; int b1=f1(x); int b2=f2(x); coutb1=b1 b2=b2endl; coutx=xendl;int &f1(int &a1)/a1和和x是一個變量是一個變量 a1+=a1; return a1; /返回值給了返回值給了a1,也就是,也就是xint f2(int a2)/將將x當(dāng)時的值(當(dāng)時的值(4)復(fù)制給)復(fù)制給a2 a2+=a2; return a2; /b1得到的是得到的是a2的值的值8。int &f1(int &a1)int aa;aa=a1*2;return aa; /錯誤錯誤改為改為f

56、1(x);int b1=x;結(jié)果相同結(jié)果相同38384. 6. 2 函數(shù)指針函數(shù)指針l 函數(shù)也占據(jù)內(nèi)存空間,即函數(shù)也占據(jù)內(nèi)存空間,即函數(shù)函數(shù)也有地址也有地址。因此。因此可以聲明一個可以聲明一個指向函數(shù)的指針指向函數(shù)的指針,可以通過這個,可以通過這個指針調(diào)用函數(shù)。這個指針就成為函數(shù)指針。指針調(diào)用函數(shù)。這個指針就成為函數(shù)指針。聲明函數(shù)指針的一般形式:聲明函數(shù)指針的一般形式:類型類型 (* *指針)(參數(shù)表)指針)(參數(shù)表)注意:類型是被指函數(shù)的返回值的類型。注意:類型是被指函數(shù)的返回值的類型。對比:對比: int *f1(int a, int b )/函數(shù)函數(shù) int (*f2)(int a, i

57、nt b);/指針指針3939#includedouble f1(double x, double y)return x+y;void main()double z;double (*p)(double a, double b);p=f1;z=(*p)(3.14, 1.23);/z=f1(3.14, 1.23);coutz=zendl;#includedouble f1(double x, double y)return x+y;void main()double z;double (*p)(double, double)=f1;z=(*p)(3.14, 1.23);coutz=zendl;4

58、040l 主要用途:如果函數(shù)的參數(shù)是函數(shù)。主要用途:如果函數(shù)的參數(shù)是函數(shù)。實參是具體用到的函數(shù)名,而形參只實參是具體用到的函數(shù)名,而形參只能是一個指向函數(shù)的指針。能是一個指向函數(shù)的指針。/使用一個指向函數(shù)的指針使用一個指向函數(shù)的指針#include #includedouble fun(double (*f1)(double),double (*f2)(double), double x)return (*f1)(x)/(*f2)(x);void main()coutfun(sin,cos,3.14/6)endl;coutfun(cos,sin,3.14/6)endl;414110151)co

59、s5sin3()(2g1(x)nnnnxnxxgxl P93P93例例4.174.17:編寫能完成各種有限:編寫能完成各種有限級數(shù)的求和函數(shù),調(diào)用它,分別級數(shù)的求和函數(shù),調(diào)用它,分別求:求: 4242/求和求和double sig(double x) double s=0.0; for(int n=1; n=5; n+) s+=x; return s;/被加的不是被加的不是x,而是,而是g1(x)=xndouble sig(double x) double s=0.0; for(int n=1; n=5; n+) s+=g1(x, n); return s;/g1(n)的功能是可以求出的功能是

60、可以求出x的的n次方次方double g1(double x, int n)double s1=1; for(int i=1; i=n; i+) s1*=x; return (s1);/被加的可能是被加的可能是g1(x, n),也可能是,也可能是g2(x, n)/g2(x, n)=3*sin(n*x)+5*cos(n*x)double sig(double x) double s=0.0; for(int n=1; n=5; n+) s+=g1(x, n); return s;double g1(double x, int n)double s1=1; for(int i=1; i=n; i+) s1*=x; return (s1);double g2(double x, int n)double s2;s2=3*sin

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論