




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第章函數(shù)5.1函數(shù)的理解在程序中,各種功能都是通過函數(shù)實現(xiàn)的。在學(xué)習(xí)函數(shù)之前需要理解函數(shù)的作用與特點。一個函數(shù)可能有返回值,可能有不同的參數(shù),完成不同的功能。本節(jié)將講解這些函數(shù)的基本概念。5.1.1函數(shù)簡單地說,函數(shù)就是把一個程序功能封裝成一個整體。函數(shù)由類型名、函數(shù)名、參數(shù)列表、函數(shù)體等部分組成,一般形式如下所示。函數(shù)這些部分的功能如下所示。類型名:函數(shù)一般會返回一個數(shù)據(jù),這個數(shù)據(jù)就是函數(shù)返回值。返回值的數(shù)據(jù)類型就是函數(shù)的數(shù)據(jù)類型。函數(shù)的類型可以是所有的數(shù)據(jù)類型。如果沒有返回值,則數(shù)的類型為 void。函函數(shù)名:函數(shù)的名稱。函數(shù)名的規(guī)則與變量命令的規(guī)則是相同的,函數(shù)名需要有效。參數(shù)列表:函數(shù)
2、輸入的參數(shù),函數(shù)需要使用這些參數(shù)進(jìn)行運(yùn)算。函數(shù)體:完成函數(shù)運(yùn)算功能的程序。在函數(shù)體中可以調(diào)用其他的函數(shù)。例如下面是一個求出兩個數(shù)中最大數(shù)的函數(shù)。這個函數(shù)可以求出兩個數(shù)中最大的一個數(shù),函數(shù)的各部分作用如下所示。max(x ,y)/*定義一個函數(shù)。*/if(xy)/*如果x 大于y 就返回x。*/return(x);else/*否則就返回y。*/return(y);類型名 函數(shù)名(參數(shù)列表)函數(shù)體;(1)是函數(shù)的類型名,表示這個函數(shù)可以返回一個整型變量。(2)函數(shù)的名稱是 max,用這個名稱可以調(diào)用這個函數(shù)。(3)參數(shù)列表是“兩個參數(shù)進(jìn)行程序運(yùn)算。x ,y”,表示這個函數(shù)有 x 和 y 兩個整型參
3、數(shù),函數(shù)體可以調(diào)用這(4)函數(shù)體中判斷兩個參數(shù)的大小,用 return 語句返回較大的一個變量。例如下面的程序,是用這個函數(shù)判斷兩個數(shù)的大小。用下面令編譯這段代碼。然后對編譯的程序添加可執(zhí)行權(quán)限。輸入下面令運(yùn)行這個程序。程序提示輸入數(shù)字,輸入一個數(shù)字 5,再按“Enter”鍵。然后用同樣的方法輸入另一個數(shù)字 1。程序的運(yùn)行結(jié)果如下所示。5.1.2系統(tǒng)函數(shù)(庫函數(shù))與用戶自定義的函數(shù)按照函數(shù)的來源,可以將函數(shù)分為系統(tǒng)函數(shù)(庫函數(shù))與用戶自定義函數(shù)。系統(tǒng)函數(shù)是編程提供的函數(shù)。用戶自定義函數(shù)是用戶自己按編程的需要編寫的函數(shù)。這兩種函數(shù)的作用與區(qū)別如下所示。177the max number is 5
4、./a.outod +x a.outgcc 9.1.c#include main()a,b,s;/*定義一個變量。*/prf(please input a:n);/*提示輸入。*/ scanf(%d,&a);/*輸入一個變量。*/ prf(please input b:n);/*提示輸入。*/ scanf(%d,&b);/*輸入另一個變量。*/s=max(a,b);/*調(diào)用函數(shù)max 求得較大的一個數(shù)。*/ prf(the max number is %dn,s); /*輸出結(jié)果。*/max(x ,y)/*定義一個函數(shù)。*/if(xy)/*如果x 大于y 就返回x。*/return(x);el
5、se/*否則就返回y。*/return(y);系統(tǒng)函數(shù):是由系統(tǒng)提供,用戶無須定義,也不必在程序中的函數(shù)。在程序需要使用庫函數(shù)時,需在程序前包含該函數(shù)的頭文件等函數(shù)都是庫函數(shù)。面章節(jié)里反復(fù)使用的 prf、scanf用戶定義函數(shù):用戶按編程的需要寫的函數(shù)。對于用戶自定義函數(shù),不僅要在程序中定義函數(shù)本身,而且在調(diào)用函數(shù)模塊中還必須對該被調(diào)函數(shù)進(jìn)行函數(shù)使用。上一節(jié)的函數(shù) max()就是一個用戶自定義函數(shù)。,然后才能5.1.3函數(shù)的返回值所謂返回值,指的是函數(shù)運(yùn)行以后會產(chǎn)生一個數(shù)據(jù),這個數(shù)據(jù)用 return 語句返回給主程序。有些函數(shù)是沒有返回值的,只執(zhí)行了一個運(yùn)行或操作過程。從這個角度可以把函數(shù)分為
6、有返回值函數(shù)和無返回值函數(shù)兩種。1有返回值函數(shù)這種函數(shù)被調(diào)用執(zhí)行以后,會向調(diào)用語句返回一個執(zhí)行結(jié)果,這個結(jié)果就是返回值。這種函數(shù)在定義時,需要指定函數(shù)的類型名。調(diào)用函數(shù)時,需要有一個變量來接受函數(shù)的返回值。例如 5.1.1 節(jié)中的下列語句。s=max(a,b);函數(shù) max 會返回一個整型的結(jié)果,這個結(jié)果需要賦值給變量 s。 2無返回值函數(shù)此類函數(shù)用于完成一定的處理過程,執(zhí)行完成后不向調(diào)用者返回結(jié)果。由于函數(shù)沒有返回值,用戶在定義此類函數(shù)時需要指定返回為“空類型”??疹愋偷恼f明符為“void”。例如下面的自定義函數(shù),就是用一個自定義函數(shù)輸出 n 個指定字符。#include void show
7、(char a ,x)/*定義一個無返回值函數(shù)。*/i;/*定義一個變量作為計數(shù)器。*/for(i=0;ix;i+)/*for 循環(huán)輸出字符。*/prf(%c,a);/*輸出這個字符。*/main()/*主函數(shù)。*/char c=a; show(c,6) ;/*定義一個變量c,賦值為a。*/*調(diào)用函數(shù),將變量c 輸出 6 次。*/*輸出一個換行。*/*調(diào)用函數(shù),將星號輸出 9 次。*/prf(n);show(*,9)用下面令編譯這段代碼。gcc 9.2.c178然后對編譯的程序添加可執(zhí)行權(quán)限。輸入下面令運(yùn)行這個程序。程序的運(yùn)行結(jié)果如下所示。5.1.4無參函數(shù)參數(shù)指的是調(diào)用語句向被調(diào)用函數(shù)傳送的
8、數(shù)據(jù)。從調(diào)用語句和被調(diào)用函數(shù)之間數(shù)據(jù)傳送的角度,又可將函數(shù)分為無參函數(shù)和有參函數(shù)兩種。無參函數(shù)指的是函數(shù)在定義、函數(shù)及函數(shù)調(diào)用中均不帶參數(shù)。調(diào)用語句和被調(diào)用函數(shù)之間不進(jìn)行參數(shù)傳送。此類函數(shù)通常用來完成一組指定的功能,可以返回一個參數(shù)。例如下面的程序中使用一個無參函數(shù)輸出一行文本。用下面令編譯這段代碼。然后對編譯的程序添加可執(zhí)行權(quán)限。輸入下面令運(yùn)行這個程序。程序的運(yùn)行結(jié)果如下所示。5.1.5有參函數(shù)與無參函數(shù)相對應(yīng)的是有參函數(shù)。有參函數(shù)在定義、調(diào)用、時都有參數(shù)。有參函數(shù)179good morning . good morning ./a.outod +x a.outgcc 9.3.c#inclu
9、de voido()/*定義一個無參函數(shù)。*/prf(good morning .n) ;/*函數(shù)中輸出一行文本。*/main()/*主函數(shù)。*/o();/*調(diào)用函數(shù)輸出信息,調(diào)用時沒有參數(shù)。*/o();/*再次調(diào)用這個函數(shù)。*/aaaaaa*./a.outod +x a.out也稱為帶參函數(shù)。在使用這些參數(shù)時,應(yīng)該注意以下內(nèi)容。在定義函數(shù)時,每一個參數(shù)都有一個具體的數(shù)據(jù)類型。在調(diào)用函數(shù)時,參數(shù)列表中的參數(shù)要與函數(shù)定義時的參數(shù)個數(shù)相同,所有的參數(shù)類型一一對應(yīng)。所給的參數(shù)數(shù)值應(yīng)該有效。如果調(diào)用時,所給的參數(shù)不合法,或者類型不匹配,或者個數(shù)不相同,程序就會發(fā)生錯誤。函數(shù)定義時的參數(shù)被稱為形式參數(shù),
10、只在函數(shù)體中有效。函數(shù)調(diào)用時的參數(shù)被稱為實際參數(shù),在主程序中是有效的變量。5.1.6函數(shù)參數(shù)實例本節(jié)講解一個函數(shù)使用實例。自定義函數(shù)有 4 個變量,前三個變量分別為整型,第 4 個變量為一個字符型。函數(shù)對三個變量進(jìn)行從小到大排列,然后用給定的字符連接輸出。前面的章節(jié)已經(jīng)講解過三個數(shù)字排序。程序的代碼如下所示。#include void order(a,b,c,chars)/*定義一個函數(shù),有 4 個參數(shù)。*/temp;/*函數(shù)中定義一個中間變量。*/if(ab)temp=a; a=b; b=temp;if(ac)temp=a; a=c; c=temp;if(bc)temp=b; b=c; c=
11、temp;/*如果a 大于b,則交換a 與b 的值。*/*a 的值給一個中間變量。*/*b 賦值給a。*/*中間變量的值賦值給b。*/*如果a 大于c,則交換a 與c 的值。*/*如果b 大于c,則交換b 與c 的值。*/prf(%d%c%d%c%d,a,s,b,s,c);/*輸出排序以后的值,并用參數(shù)中的字符s 連接。*/main()order(5,4,7,-);/*調(diào)用函數(shù)。*/*輸出一個換行。*/prf(n);order(7,55,32,);prf(n);order(9,3,6,.);180用下面令編譯這段代碼。然后對編譯的程序添加可執(zhí)行權(quán)限。輸入下面令運(yùn)行這個程序。程序的運(yùn)行結(jié)果如下所
12、示。自定義函數(shù) order 的類型如下所示。void order(a ,b,c,char s)這個函數(shù)沒有返回值,有 4 個參數(shù)。其中前三個參數(shù)是整型,后一個參數(shù)是字符類型。所以需要用下面的語句來調(diào)用這個函數(shù)。調(diào)用時,參數(shù)列表中的參數(shù)需要與定義的參數(shù)列表相同。5.2自定義函數(shù)在程序中需要把各種模塊封裝為自定義函數(shù),在使用這個函數(shù)時,可以不考慮函數(shù)的內(nèi)部執(zhí)行過程。這樣可以簡化程序的設(shè)計,使代碼和模塊得到有效的重用。5.2.1自定義函數(shù)的編寫編寫復(fù)雜程序時,需要將不同的功能分解為多個函數(shù),這樣可以簡化程序的執(zhí)行過程。在編寫自定義函數(shù)時,需要考慮函數(shù)的參數(shù)與返回值。例如要編寫一個分?jǐn)?shù)等級判斷的函數(shù)。
13、用戶從鍵盤輸入一個分?jǐn)?shù),程序調(diào)用一個函數(shù)來判斷成績的等級,并返回表示等級的字符。當(dāng)輸入數(shù)字 0 時,退出這個程序。需要用下面的方法來實現(xiàn)這個程序。(1)需要用 while 循環(huán)語句,一個循環(huán)。輸入一個數(shù)值,判斷這個數(shù)值是不是 0。如果數(shù)值為 0,則中止循環(huán)。如果數(shù)值不為 0,則調(diào)用函數(shù)判斷成績。成績作為函數(shù)調(diào)用的參數(shù),返回一個字符。自定義函數(shù)可以用 if 語句的嵌套結(jié)構(gòu)來實現(xiàn)分?jǐn)?shù)等級的判斷。根據(jù)這個思路,編寫出的程序如下所示。181#include char result(x)/*定義一個分?jǐn)?shù)評定函數(shù)。*/order(5,4,7,-);order(7,55,32,);order(9,3,6,.
14、);4-5-7732=90)s=A;elseif(x=80)s=B;elseif(x=70)s=C;elseif(x=60)s=D;elses=E;return(s);/*定義一個字符變量結(jié)果。*/*90 分以上的結(jié)果為A。*/*其他的值 80 分以上的結(jié)果為B。*/*其他的值 70 分以上的結(jié)果為C。*/*其他的值 60 分以上的結(jié)果為D。*/*其他的值一定小于 60,結(jié)果為E。*/*將變量s 作為返回值返回。*/main()/*主函數(shù)。*/char r;/*定義一個存放結(jié)果的變量。*/i=1 ;/*定義存放分?jǐn)?shù)的變量,賦初值為 1。*/while(i!=0)scanf(%d,&i); r=
15、result(i);prf(%cn,r);/*i 的值不為 0 則提示輸入和判斷結(jié)果。*/*輸入一個數(shù)值。*/*調(diào)用函數(shù)判斷等級,返回值賦值給r。*/*輸出結(jié)果。*/輸入下面令編譯這段代碼。gcc 9.5c然后對編譯的程序添加可執(zhí)行權(quán)限。od +x a.out182輸入下面令運(yùn)行這個程序。./a.out在程序中輸入一個數(shù)字 55,然后按“Enter”鍵,程序會輸出一個結(jié)果 E。輸入相應(yīng)的數(shù)值,程序能正確輸出判斷結(jié)果。輸入數(shù)字 0,程序結(jié)束。5.2.2函數(shù)中調(diào)用函數(shù)在自定義函數(shù)中,可以調(diào)用另外一個自定義函數(shù)。這樣,就可以把復(fù)雜的程序功能分解為多個簡單的函數(shù)。例如上一節(jié)中的程序,沒有對輸入值的有效
16、性進(jìn)行判斷??梢赃M(jìn)行分?jǐn)?shù)之前,用一個函數(shù)判斷輸入的值是否合理,然后這個函數(shù)再調(diào)用分?jǐn)?shù)序的代碼如下所示。函數(shù) result。程183#include char result(x)/*定義一個分?jǐn)?shù)評定函數(shù)。*/char s;/*定義一個字符變量結(jié)果。*/if(x=90)/*90 分以上的結(jié)果為A。*/s=A;else/*其他的值 80 分以上的結(jié)果為B。*/if(x=80)s=B;elseif(x=70)/*其他的值 70 分以上的結(jié)果為C。*/s=C;elseif(x=60)/*其他的值 60 分以上的結(jié)果為D。*/s=D;else/*其他的值一定小于 60,結(jié)果為E。*/s=E;return(
17、s);/*將變量s 作為返回值返回。*/void myresult(x)/*定義一個有數(shù)值有效性判斷功能的函數(shù),無返回值。*/char s; if(x0&x=100)s=result(x);/*存放結(jié)果的變量。*/*數(shù)值在這個范圍內(nèi)有效。*/*調(diào)用函數(shù)result()判斷分?jǐn)?shù)等級。*/*輸出結(jié)果。*/prelseprf(%cn,s);/*其他值的分?jǐn)?shù)。*/f(error.n,s);/*輸出錯誤提示。*/main()/*主函數(shù)。*/i=1 ;/*定義存放分?jǐn)?shù)的變量,賦初值為 1。*/while(i!=0)scanf(%d,&i); myresult(i);/*i 的值不為 0 則提示輸入和判斷結(jié)
18、果。*/*輸入一個數(shù)值。*/*調(diào)用函數(shù)判斷等級,返回值賦值給r。*/輸入下面令編譯這段代碼。gcc 9.6c然后對編譯的程序添加可執(zhí)行權(quán)限。od +x a.out輸入下面令運(yùn)行這個程序。./a.out在程序中輸入一個數(shù)字 123,然后按“Enter”鍵,程序會輸出提示“error.”。輸入 1 至100 的數(shù)值,程序會判斷并顯示出這個分?jǐn)?shù)的級別。輸入數(shù)值 0,程序結(jié)束運(yùn)行。5.2.3函數(shù)的在 C 程序中,如果需要調(diào)用后面的自定義函數(shù),需要在程序最前面明,程序就會發(fā)生錯誤,提示程序中找不到相應(yīng)的函數(shù)。函數(shù)。如果未聲函數(shù)的方法,是在程序的最前面,列出程序中可能調(diào)用的自定義函數(shù)。需要列出與函數(shù)定義相
19、同的類型名、函數(shù)名、參數(shù)列表。下面的程序,是將上一節(jié)中的自定義函數(shù)寫在后面,并在程序最前面函數(shù)。184#include void myresult(x);/*程序中的函數(shù)myresult。*/char result(aax);/*函數(shù)result。*/*函數(shù)結(jié)束,下面是主函數(shù)。*/main()/*主函數(shù)將調(diào)用后面的函數(shù)。*/185i=1 ;/*定義存放分?jǐn)?shù)的變量,賦初值為 1。*/ while(i!=0)/*i 的值不為 0 則提示輸入和判斷結(jié)果。*/scanf(%d,&i);/*輸入一個數(shù)值。*/myresult(i);/*調(diào)用函數(shù)判斷等級,返回值賦值給r。*/void myresult(x
20、)/*定義一個有數(shù)值有效性判斷功能的函數(shù),無返回值。*/char s;/*存放結(jié)果的變量。*/if(x0&x=90)/*90 分以上的結(jié)果為A。*/s=A;else/*其他的值 80 分以上的結(jié)果為B。*/if(x=80)s=B;elseif(x=70)/*其他的值 70 分以上的結(jié)果為C。*/s=C;elseif(x=60)/*其他的值 60 分以上的結(jié)果為D。*/s=D;else/*其他的值一定小于 60,結(jié)果為E。*/s=E;這個程序與上一節(jié)中的程序運(yùn)行結(jié)果是相同的。只是在主函數(shù)的后面編寫自定義函數(shù),在程序的最前面函數(shù)。5.2.4遞歸函數(shù)所謂遞歸函數(shù),指的是函數(shù)調(diào)用自身,用循環(huán)的方法實現(xiàn)
21、運(yùn)算。例如一個程序求出 100以內(nèi)的整數(shù)和,可以用下面的。用這種思路可以用反復(fù)調(diào)用自身函數(shù)的方法求出 100 以內(nèi)的整數(shù)和。這個程序的代碼如下所示。#include addn(x)/*定義一個函數(shù),實現(xiàn) 0 到x 之間整數(shù)的相加。*/s;/*定義一個變量保存結(jié)果。*/if(x=1)s=1;elses=x + addn(x-1);return(s);/*結(jié)果x 為 1,則結(jié)果為 1。*/*x 不為 1 的情況。*/*遞歸調(diào)用自身函數(shù)。*/*輸出一個結(jié)果。*/main()i=100;j;/*定義一個變量,賦值為 100。*/*定義一個變量結(jié)果。*/j=addn(i);/*調(diào)用函數(shù)求出結(jié)果。*/*輸
22、出結(jié)果。*/prf(result:%d,j);輸入下面令編譯這段代碼。gcc 9.8c然后對編譯的程序添加可執(zhí)行權(quán)限。186100 以內(nèi)的整數(shù)和 = 100 + 99 以內(nèi)的整數(shù)和;99 以內(nèi)的整數(shù)和 = 99 +98 以內(nèi)的整數(shù)和;2 以內(nèi)的整數(shù)和 = 2 +以 1 以內(nèi)的整數(shù)和;1 以內(nèi)的整數(shù)和為 1。return(s);/*將變量s 作為返回值返回。*/輸入下面令運(yùn)行這個程序。程序的結(jié)果如下所示。5.2.5main 函數(shù)的參數(shù) argc 與 argv前面的例子中,main()函數(shù)都是沒有參數(shù)的。但編寫的程序常常需要從命令行中輸入?yún)?shù)。例如,Linux 命令中文件令如下所示?!癱p”后面的
23、兩個字符串就是這個程序的參數(shù)。在 main()函數(shù)中,默認(rèn)有 argc 與 argv 兩個參數(shù)。main 函數(shù)的原型如下所示。main(argc , char *argv)main 函數(shù)是有一個返回值的,如果程序執(zhí)行成功,則返回一個整型值 1。程序中常常省略這個返回值。argc 是一個整型變量,表示參數(shù)的個數(shù)。*argv是一個指針型數(shù)組,數(shù)組中的每一個指針指向一個參數(shù)的字符數(shù)組。下面的程序可以輸出程序啟動時后面的參數(shù)。輸入下面令編譯這段代碼。然后對編譯的程序添加可執(zhí)行權(quán)限。輸入下面令運(yùn)行這個程序。在程序的后面加上若干個參數(shù)。程序的結(jié)果如下所示。187o good evening./a.outo
24、 good eveningod +x a.outgcc 9.9c#include main(argc, char *argv)i ;/*定義一個計數(shù)器變量。*/for(i=0;iargc;i+)/*用變量i 進(jìn)行for 循環(huán)。*/prf(%sn,argvi);/*輸出一個指針?biāo)赶虻淖址?/cp /root/1.txt /root/2.txtresult: 5050./a.outod +x a.out5.3函數(shù)與指針函數(shù)的參數(shù)與返回值可以是指針。使用指針變量可以在函數(shù)中對其他函數(shù)的變量進(jìn)行調(diào)用。利用數(shù)組的頭指針,可以用指針移動的方法數(shù)組中的每個元素,所以可用指針作為參數(shù)使函數(shù)一個數(shù)組。本節(jié)
25、將講述函數(shù)中的指針應(yīng)用。5.3.1值調(diào)用與調(diào)用函數(shù)對參數(shù)的調(diào)用,有值調(diào)用和兩種參數(shù)調(diào)用的處理方法是不同的。調(diào)用兩種方法。前面的例子都是值調(diào)用。函數(shù)對這值調(diào)用:進(jìn)行函數(shù)調(diào)用時候,給形式參數(shù)分配內(nèi)存空間,并把實際參數(shù)的值直接傳遞給形式參數(shù)。這一過程是參數(shù)值的直接傳遞過程。一旦形式參數(shù)獲得了值,形式參數(shù)的變化對實際參數(shù)沒有任何影響。調(diào)用:當(dāng)用指針或數(shù)組作為函數(shù)的參數(shù)時,可以用指針來式參數(shù)的變化將直接引起實際參數(shù)的變化。實際參數(shù)的值。形例如在下面的程序中,形式參數(shù)的改變不會影響實際參數(shù)的值。#include /*定義一個函數(shù),參數(shù)為x。*/ aa(x)/*更改x 的值。*/*返回x。*/x = x*x
26、; return(x);main()/*定義兩個整型變量x 與y。*/*x 賦值為 5。*/*調(diào)用函數(shù),返回值賦值給y。*/*輸出x 與y。*/x,y;x=5;y=aa(x);prf(X: %d Y: %dn,x,y);輸入下面令編譯這段代碼。gcc 9.10.c然后對編譯的程序添加可執(zhí)行權(quán)限。od +x a.out輸入下面令運(yùn)行這個程序。./a.out程序的結(jié)果如下所示。X: 5 Y: 25188注意:調(diào)用語句中的參數(shù)是實際參數(shù),被調(diào)用函數(shù)中的參數(shù)是形式參數(shù)。這一概念見本章 5.1.5 節(jié)所述。從結(jié)果可知,函數(shù)中更改形式參數(shù)的值,并不會對實際參數(shù)的值造成影響。實際參數(shù)的值給形式參數(shù)以后,形式
27、參數(shù)無法實際參數(shù)。5.3.2調(diào)用與指針雖然函數(shù)調(diào)用時默認(rèn)是值調(diào)用,但是傳入的參數(shù)如果是指針,函數(shù)可以通過這個指針改變函數(shù)外部變量的值。參數(shù)的調(diào)用就是通過指針對外部變量的來實現(xiàn)的。指針可以同普通變量一樣,作為一個參數(shù)傳遞給一個函數(shù)。函數(shù)可以更改這一個指針和指針指向的變量。下面的程序是通過傳入指針來更改函數(shù)以外變量的值。輸入下面令編譯這段代碼。然后對編譯的程序添加可執(zhí)行權(quán)限。輸入下面令運(yùn)行這個程序。程序輸出的結(jié)果如下所示。從結(jié)果可知,自定義函數(shù)通過參數(shù)中的指針指針?biāo)赶虻淖兞浚瑥亩粨Q了兩個變189m:3 n:5m:5 n:3m:3 n:5./a.outod +x a.outgcc 9.11.c#
28、include void change(*x,*y);一個函數(shù)。*/main()/*主函數(shù)。*/m,n;/*定義兩個變量。*/m=3;/*對兩個變量賦值。*/n=5;prf(m:%d n:%dn,m,n);/*輸出兩個變量。*/ change(&m,&n);/*用函數(shù)交換兩個變量。*/ prf(m:%d n:%dn,m,n);/*輸出兩個變量。*/ change(&m,&n);/*用函數(shù)交換兩個變量。*/ prf(m:%d n:%dn,m,n);/*輸出兩個變量。*/void change(*x,*y)/*定義一個函數(shù),指針作為函數(shù)的參數(shù)。*/temp;/*定義一個中間變量。*/temp=*x
29、;/*指針指向的值賦值給中間變量。*/*x=*y;/*指針y 指向的值賦值給指針x 指向的值。*/*y=temp;/*中間變量的值賦值給指針y 指向的值。*/量的值。這種指針變量的方法就是函數(shù)對參數(shù)的調(diào)用。5.3.3指針參數(shù)簡單實例本節(jié)將講解一個指針參數(shù)實例,通過自定義函數(shù)對參數(shù)的函數(shù)有三個參數(shù),分別為三個變量的指針。函數(shù)通過指針來碼如下所示。調(diào)用對三個變量進(jìn)行排序。主函數(shù)中的數(shù)值。程序的代#include void order(*x,*y,*z);/*一個函數(shù)。*/main()/*主函數(shù)。*/a,b,c;/*定義三個變量。*/a=5; b=3; c=8;pr/*對三個變量賦值。*/f(%d%
30、d %dn,a,b,c);/*輸出三個變量。*/*調(diào)用函數(shù)對三個變量進(jìn)行排序。*/*輸出三個變量。*/order(&a,&b,&c);prf(%d%d %dn,a,b,c);void order(*x,*y,*z)/*自定義函數(shù)對三個變量進(jìn)行排序。*/temp;/*定義一個中間變量。*/if(*x *y)temp=*x;*x=*y;*y=temp;if(*x *z)/*對指針指向的值進(jìn)行比較。*/*用一個中間變量指針變量x 指向的值。*/*指針y 指向的值賦值給指針x 指向的值。*/*中間變量的值賦值給指針y 指向的值。*/*同樣的方法,對 x 和 z 兩個指針指向的值進(jìn)行排序。*/temp=
31、*x;*x=*z;*z=temp;if(*y *z)/*同樣的方法,對 y 和 z 兩個指針指向的值進(jìn)行排序。*/temp=*y;*y=*z;*z=temp;輸入下面令編譯這段代碼。gcc 9.12.c190然后對編譯的程序添加可執(zhí)行權(quán)限。輸入下面令運(yùn)行這個程序。程序輸出的結(jié)果如下所示。與前面章節(jié)的三個數(shù)字進(jìn)行排序不同的是這個程序調(diào)用一個函數(shù),并將三個變量的指針作為參數(shù),函數(shù)通過指針來程序中的變量。5.3.4自定義函數(shù)中指針使用實例在 5.3.2 節(jié)中,用指針實現(xiàn)了兩個變量的交換。在 5.3.3 節(jié)中,對兩個變量進(jìn)行排序時需要對兩個變量使用指針進(jìn)行交換。實際上,在自定義函數(shù)中可以用函數(shù)中的指針
32、作為參數(shù)另外一個函數(shù)。本節(jié)中使用了與 5.3.2 節(jié)中相同的函數(shù),代碼如下所示。191#include void order(*x ,*y,*z);/*一個函數(shù)。*/ void change(*x,*y);一個函數(shù)。*/main()/*主函數(shù)。*/a,b,c;/*定義三個變量。*/a=5;/*對三個變量賦值。*/b=3; c=8;prf(%d %d %dn,a,b,c);/*輸出三個變量。*/order(&a,&b,&c);/*調(diào)用函數(shù)對三個變量進(jìn)行排序。*/ prf(%d %d %dn,a,b,c);/*輸出三個變量。*/void order(*x ,*y,*z) /*自定義函數(shù)對三個變量進(jìn)
33、行排序。*/if(*x *y)/*對指針x 和y 指向的值進(jìn)行比較。*/change(x,y);/*用函數(shù)change 交換兩個指針?biāo)赶虻淖兞俊?/if(*x *z)/*對指針y 和z 指向的值進(jìn)行比較。*/change(x,z);/*用函數(shù)change 交換兩個指針?biāo)赶虻淖兞俊?/if(*y *z)/*對指針y 和z 指向的值進(jìn)行比較。*/change(y,z);/*用函數(shù)change 交換兩個指針?biāo)赶虻淖兞俊?/5 3 83 5 8./a.outod +x a.outvoid change(*x,*y)/*定義一個函數(shù),指針作為函數(shù)的參數(shù)。*/temp;/*定義一個中間變量。*/te
34、mp=*x;*x=*y;*y=temp;/*指針指向的值賦值給中間變量。*/*指針y 指向的值賦值給指針x 指向的值。*/*中間變量的值賦值給指針y 指向的值。*/輸入下面令編譯這段代碼。然后對編譯的程序添加可執(zhí)行權(quán)限。od +x a.out輸入下面令運(yùn)行這個程序。./a.out程序的功能與上一節(jié)的功能是相同的,實現(xiàn)對三個數(shù)的排序。在排序時使用了兩次調(diào)用函數(shù)。程序輸出的結(jié)果如下所示。5.3.5數(shù)組作為參數(shù)數(shù)組在定義時會返回一個頭指針,可以把這個頭指針作為函數(shù)的參數(shù),函數(shù)可以通過指數(shù)組中所有的變量。例如下面的代碼就是把數(shù)組的指針作為函數(shù)的參數(shù),函數(shù)用指針一個數(shù)組。針來#include void
35、myarray(*a)/*定義一個函數(shù),用數(shù)組作為參數(shù)。*/i;/*定義一個循環(huán)變量。*/for(i=0;i10;i+)*a=*a+15; a+;/*for 循環(huán),處理數(shù)組中的值。*/*指針指向的變量加上 15。*/*指針向后移動一個變量。*/main()/*主函數(shù)。*/i ; m10;/*定義一個變量作為計數(shù)器。*/*定義一個數(shù)組。*/for(i=0;i10;i+)mi=i+10;for(i=0;i10;i+)/*用for 循環(huán)對數(shù)組賦值。*/*數(shù)組賦值。*/*for 循環(huán)輸出結(jié)果。*/1925 3 83 5 8gcc 9.13c輸入下面令編譯這段代碼。然后對編譯的程序添加可執(zhí)行權(quán)限。輸入下
36、面令運(yùn)行這個程序。在這個程序中,將數(shù)組的頭指針作為函數(shù)的參數(shù)。函數(shù)通過這個指針來一個變量,將每個變量的值加 15。程序的運(yùn)行結(jié)果如下所示。數(shù)組中的每19310 11 12 13 14 15 16 17 18 1925 26 27 28 29 30 31 32 33 34./a.outod +x a.outgcc 9.14cprf(%d ,mi);/*輸出結(jié)果。*/prf(n);/*輸出一個換行。*/myarray(m);/*把數(shù)組的頭指針作為參數(shù),數(shù)組中的每一個值。*/for(i=0;i10;i+)/*for 循環(huán)輸出結(jié)果。*/prf(%d ,mi);/*輸出結(jié)果。*/5.3.6數(shù)組作為函數(shù)參
37、數(shù)實例數(shù)組作為函數(shù)參數(shù),可以方便地函數(shù)外部的數(shù)組,這樣函數(shù)就可以對函數(shù)外的多個變量發(fā)生作用。本節(jié)將講解一個數(shù)組作為函數(shù)參數(shù)的實例,實現(xiàn)下面這些功能。定義三個字符串?dāng)?shù)組,前兩個字符串?dāng)?shù)組分別賦值。自定義一個函數(shù),將三個字符串?dāng)?shù)組的指針作為參數(shù)。函數(shù)將第二個數(shù)組添加到第一個數(shù)組后面,然后保存到第三個數(shù)組上。(3)對數(shù)組的是通過數(shù)組的指針完成的。程序的代碼如下所示。#include void stradd(char *a,charwhile(*a!=NULL)*c=*a; c+; a+;while(*b!=NULL)*c=*b; c+; b+;*b,char*c)/*定義接字符串的函數(shù),參數(shù)是 3
38、個指針。*/*如果指針a 對定的字符不是空字符則進(jìn)行循環(huán)。*/*指針a 指向的字符賦值給指針c 指向的字符。*/*指針c 向后移動一個元素。*/*指針a 指向下一個變量。*/*如果指針b 指向的變量不為空字符則進(jìn)行循環(huán)。*/*指針b 指向的字符賦值給指針c 指向的字符。*/*指針c 指向下一個字符。*/*指針b 指向下一個字符。*/main()char char chara30=abcdefg;b30=HIJKLMN;c30=;/*定義一個字符串?dāng)?shù)組,賦初值。*/*定義一個字符串?dāng)?shù)組b,賦初值。*/*定義一個字值串?dāng)?shù)組,賦值為空。*/prf(a: %sn,a);f(b: %sn,b);/*輸出
39、第一個字符串?dāng)?shù)組。*/*輸出第二個字符串?dāng)?shù)組。*/prstradd(a,b,c);/*調(diào)用函數(shù),連接兩個字符串?dāng)?shù)組。*/*輸出字符串c。*/prf(c: %sn,c);在這個程序的 stradd 函數(shù)中,是通過指針的移動和判斷字符來實現(xiàn)字符串的連接的。下面的代碼實現(xiàn)了字符串 a到字符串 c 上。程序是用下面的方法來執(zhí)行字符串的的。194while(*a!=NULL)/*如果指針a 對定的字符不是空字符則進(jìn)行循環(huán)。*/*c=*a;/*指針a 指向的字符賦值給指針c 指向的字符。*/c+;/*指針c 向后移動一個元素。*/a+;/*指針a 指向下一個變量。*/先判斷指針 a 指向的字符是不是 NU
40、LL,如果不是 NULL,則進(jìn)行 while 循環(huán)。將指針 a 當(dāng)前的字符賦值給指針 c 當(dāng)前的字符。在這個過程中是用 while 循環(huán)來逐個進(jìn)行字符的。指針 c 指向后一個字符。指針 a 指向后一個字符。然后進(jìn)行下次循環(huán)。結(jié)果指針 a 指向的字符為 NULL,表示數(shù)組 a 已經(jīng)結(jié)束。(5)用同樣的步驟將字符串 b 上所有的字符到字符串 c 后面。輸入下面令編譯這段代碼。然后對編譯的程序添加可執(zhí)行權(quán)限。輸入下面令運(yùn)行這個程序。程序的運(yùn)行結(jié)果如下所示。5.4返回值函數(shù)執(zhí)行一個操作過程以后一般需要返回一個處理結(jié)果,這個結(jié)果就是函數(shù)的返回值。函數(shù)可以用一個數(shù)值返回、用指針返回,也可以用指針直接函數(shù)的
41、返回值問題。程序中的變量。本節(jié)將講解5.4.1函數(shù)返回值的類型函數(shù)的返回值根據(jù)數(shù)據(jù)類型和處理方式的不同,一般有下面的幾種形式。函數(shù)對這幾種類型返回值的處理是不同的。無返回值:這種函數(shù)只是完成了一個處理過程。完成函數(shù)的運(yùn)行以后程序會自動中止運(yùn)行。無返回值的函數(shù)需要用 void 來。返回一個具體值:函數(shù)返回運(yùn)算的結(jié)果。函數(shù)執(zhí)行的是一個運(yùn)算,對參數(shù)進(jìn)行處理以后將結(jié)果作為一個具體數(shù)據(jù)類型的變量值來返回。這類函數(shù)在定義時需要數(shù)據(jù)類型。函數(shù)的用指針來主函數(shù)中的變量:在 5.3.3 節(jié)與 5.3.4 節(jié)講解的內(nèi)容中,函數(shù)可以通過指針來指針函數(shù)外部的變量。這種函數(shù)雖然沒有返回值,但是對外部變量產(chǎn)生了影響。外部
42、變量的方式,可以看作是一種特殊的返回值。返回一個指針:指針是一種特殊的數(shù)據(jù)類型。函數(shù)中的指針可以作為返回值返回給主函數(shù)。這類函數(shù)需要用指針數(shù)據(jù)類型來。195a: abcdefg b: HIJKLMNc: abcdefgHIJKLMN./a.outod +x a.outgcc 9.15c返回結(jié)果到參數(shù):如果參數(shù)中有一個指針,可以用這個指針直接的變量。這種方式可以看作是將結(jié)果返回到參數(shù)中。這個指針?biāo)赶蚯叭N情況面的節(jié)已經(jīng)講解。后面的節(jié)將重點講解后面的兩種返回類型。5.4.2函數(shù)返回指針指針是一種特殊的數(shù)據(jù)類型,表示指向一個變量的內(nèi)存地址。函數(shù)也可以返回一個指針,在主函數(shù)中可以用這個指針來所指向的
43、變量。例如下面的程序是用一個函數(shù)來選擇兩個數(shù)中較大的一個數(shù),返回較大數(shù)的指針,然后主函數(shù)通過這個指針輸出結(jié)果。程序的代碼如下所示。#include *max(*i,*j)/*定義一個函數(shù)求兩個數(shù)的最大值,返回一個指針。*/*p;/*定義一個指針,結(jié)果。*/if(*i*j)p=i;elsep=j;return(p);/*比較兩個指針?biāo)赶蜃兞康拇笮 ?/*指針i 賦值給指針p。*/*另一種情況是指針j 賦值給指針p。*/*返回指針p。*/main()/*程序的主函數(shù)。*/i ,j*q;/*定義兩個變量。*/*定義一個指向整型變量的指針。*/i=5; j=3;q=max(&i,&j);/*變量賦初
44、值。*/*取兩個數(shù)的指針作為參數(shù),求兩個數(shù)的較大值。函數(shù)會返回較大數(shù)的指針。*/*輸出指針q 指向的變量值。*/prf(max =%d,*q);輸入下面令編譯這段代碼。gcc 9.16c然后對編譯的程序添加可執(zhí)行權(quán)限。od +x a.out輸入下面令運(yùn)行這個程序。./a.out程序的運(yùn)行結(jié)果如下所示。51965.4.3函數(shù)返回指針實例本節(jié)將講解一個函數(shù)返回指針實例。自定義一個函數(shù)連接兩個字符串,兩個字符串的指針作為函數(shù)的參數(shù),函數(shù)連接兩個字符串以后返回連接以后字符串的指針。程序的代碼如下所示。輸入下面令編譯這段代碼。然后對編譯的程序添加可執(zhí)行權(quán)限。輸入下面令運(yùn)行這個程序。在這個程序中,函數(shù)把字
45、符串 b 添加到字符串 a 上,實際上返回的是 a 的指針。程序的運(yùn)行結(jié)果如下所示。197./a.outod +x a.outgcc 9.17c#include char *stradd(char *a,char *b) /*定義接字符串函數(shù),參數(shù)是兩個指針,返回一個指針。*/char *p;/*定義一個指針p。*/p=a;/*把指針p 賦值給指針a。*/while(*a!=NULL)/*如果指針a 對定的字符不是空字符則進(jìn)行循環(huán)。*/a+;/*指針a 指向下一個變量。*/while(*b!=NULL)/*如果指針b 指向的變量不為空字符則進(jìn)行循環(huán)。*/*a=*b;/*指針b 指向的字符賦值給
46、指針c 指向的字符。*/b+;/*指針b 指向下一個字符。*/a+;/*指針a 指向下一個字符。*/return(p);/*返回指針p,也就是返回原來的指針a。*/main()char a30=abcdefg; /*定義一個字符串?dāng)?shù)組a,賦初值。*/ char b30=HIJKLMN; /*定義一個字符串?dāng)?shù)組b,賦初值。*/ char *c;/*定義一個指向字符的指針c。*/pr f(a: %sn,a); /*輸出第一個字符串?dāng)?shù)組。*/ pr f(b: %sn,b); /*輸出第二個字符串?dāng)?shù)組。*/c= stradd(a,b);/*調(diào)用函數(shù),連接兩個字符串?dāng)?shù)組,然后返回一個指針。*/ prf(
47、c: %sn,c);/*輸出這個指針?biāo)赶虻淖址麛?shù)組。*/5.4.4函數(shù)返回結(jié)果到參數(shù)如果函數(shù)的參數(shù)是指針,那么函數(shù)可以這個指針?biāo)赶虻淖兞康闹担瘮?shù)就可以把結(jié)果返回給參數(shù)中的指針變量。如果函數(shù)的參數(shù)不是指針,函數(shù)是不能把結(jié)果返回給參數(shù)的。例如下面的代碼是實現(xiàn)兩個數(shù)的加法,將結(jié)果返回給參數(shù)的指針。#include void add(*c=a+b;a,b,*c)/*定義一個自定義函數(shù),參數(shù)是兩個整型變量和一個指針。*/*將相加的結(jié)果賦值給參數(shù)中指針指向的值。*/main()/*程序的主函數(shù)。*/a,b,c;/*定義三個整型變量。*/a=5; b=8;add(a,b,&c);/*變量賦值。*/*調(diào)
48、用函數(shù)求和,c 取地址作為參數(shù)。*/*輸出c 的值。*/prf(reslutis %d,c);5.5庫函數(shù)在 C 程序的編譯器中有大量的庫函數(shù)。庫函數(shù)可以完成復(fù)雜的程序功能。用戶在編程時可以直接調(diào)用系統(tǒng)的庫函數(shù)。本章將介紹庫函數(shù)的調(diào)用方法。5.5.1庫函數(shù)的種類庫函數(shù)是按照不同的功能封裝在多個頭文件中的。用戶在需要調(diào)用庫函數(shù)時需要在程序的最前面用 include 語句包含相關(guān)的頭文件。庫函數(shù)的常用功能與種類如下所示。字符類型分類函數(shù):對字符按照字母、數(shù)字、控制字符、分隔符、大小寫字母等方面進(jìn)行分類和測試。轉(zhuǎn)換函數(shù):用于字符或字符串的轉(zhuǎn)換??梢栽谧址兞亢透黝悢?shù)字變量之間進(jìn)行轉(zhuǎn)換,也可以在大、小
49、寫之間進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。目錄路徑函數(shù):用于文件目錄和路徑操作,可以對文件或目錄進(jìn)行創(chuàng)建、刪除、移動等操作。函數(shù):用于系統(tǒng)錯誤檢測,完成系統(tǒng)管理、系統(tǒng)的功能。圖形函數(shù):用于屏幕管理和繪制各種圖形,這些函數(shù)可以用不同顏色設(shè)計出圖形效果。輸入輸出函數(shù):用各種設(shè)備的輸入輸出功能,實現(xiàn)用戶與這些設(shè)備的交互與管理。接口函數(shù):用于系統(tǒng)、BIOS 和硬件的接口,完成設(shè)備的控制與管理。字符串函數(shù):用于字符串操作和處理,完成字符串的、轉(zhuǎn)換、全并等功能。198a: abcdefg b: HIJKLMNc: abcdefgHIJKLMN內(nèi)存管理函數(shù):用于內(nèi)存管理,程序可以用這些功能申請或常常使用這些內(nèi)存管理函數(shù)。內(nèi)存。在數(shù)據(jù)結(jié)構(gòu)中數(shù)學(xué)函數(shù):用于數(shù)學(xué)函數(shù)計算。例如開方、乘方、指數(shù)、對數(shù)等數(shù)用數(shù)學(xué)函數(shù)來完成的。算,是通過調(diào)日期和時間函數(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司返合同范本
- 單位合伙型聯(lián)營合同范本
- 廠房維修簡易合同范本
- 公司企業(yè)工程合同范本
- 京東金條借款合同范本
- 醫(yī)用化妝品購銷合同范例
- 口罩機(jī)采購合同范本
- 出租文物合同范例
- 合作期限 合同范例
- 合作英語合同范本
- 教科版-六年級科學(xué)下冊制作校園生物分布圖課件
- 2024年蘇州經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 農(nóng)林行業(yè)就業(yè)現(xiàn)狀分析
- 2024版全文:中國二型糖尿病防治全指南
- 玄武巖纖維簡介演示
- 決策氣象服務(wù)流程
- 無人機(jī)法律法規(guī)與安全飛行 第2版 課件 第4章 無人機(jī)法規(guī)與安全
- 施工會議紀(jì)要15篇
- 電力變壓器安裝技術(shù)規(guī)范
- 《生理學(xué)》課程標(biāo)準(zhǔn)
- GB/T 24478-2023電梯曳引機(jī)
評論
0/150
提交評論