書(shū)接上回
上期主要是C語(yǔ)言中關(guān)于函數(shù)的部分知識(shí),我向大家介紹了函數(shù)的定義,庫(kù)函數(shù),自定義函數(shù)的定義和使用方法及函數(shù)參數(shù)的類型。這些內(nèi)容都是對(duì)函數(shù)的基本認(rèn)識(shí),而函數(shù)在編程過(guò)程中的具體使用和更深層次的知識(shí)我們將在本期及下期內(nèi)容介紹。話不多說(shuō),我們開(kāi)始本期的學(xué)習(xí)
本期將在上期基礎(chǔ)之上繼續(xù)加深對(duì)函數(shù)的認(rèn)識(shí)
1.函數(shù)的兩種調(diào)用方法和區(qū)別
2.函數(shù)的嵌套調(diào)用和鏈?zhǔn)皆L問(wèn)
3.函數(shù)的聲明和定義
- 函數(shù)的調(diào)用 :
** 傳值調(diào)用**
函數(shù)的形參和實(shí)參分別占有不同的內(nèi)存塊,對(duì)形參的修改不會(huì)影響實(shí)參
** 傳址調(diào)用
** 傳址調(diào)用是把函數(shù)外部創(chuàng)建變量的內(nèi)存地址傳遞給函數(shù)參數(shù)的一種調(diào)用函數(shù)的方式
此傳參方式可以讓函數(shù)和函數(shù)外面的變量建立起真正的聯(lián)系。也就是說(shuō),函數(shù)內(nèi)部可以直接操作函數(shù)外部的變量。
只聽(tīng)定義會(huì)一頭霧水,接下來(lái)我為大家提供一個(gè)具體問(wèn)題來(lái)方便大家感受兩種調(diào)用的區(qū)別。
應(yīng)用:**【給出兩個(gè)變量a,b。 要求交換二者的值】**
#include
void swap1(int x,int y)//此函數(shù)無(wú)返回值,因此用"void"作為返回值類型
{
int tmp=0;
tmp=x;
x=y;
y=tmp;
}//定義函數(shù),交換變量值
int main()
{
int a=10;
int b=20;
swap1(a,b);//無(wú)返回值函數(shù)的執(zhí)行方法,我們接下來(lái)會(huì)提到
printf("a= %d b= %d",a,b);
return 0;
}
如上述函數(shù),我們看似成功地完成了任務(wù),但當(dāng)我們?cè)趫?zhí)行程序之后,屏幕上打印出來(lái)的卻仍是"a=10 b=20",這說(shuō)明我們剛才所寫(xiě)函數(shù)并不能完成我們所預(yù)期的功能,那問(wèn)題出在哪里呢?請(qǐng)看接下來(lái)的代碼:
#include
void swap2(int* x,int* y)//此處與上面函數(shù)不同,體會(huì)"int"與"int*"的區(qū)別
{
int tmp=0;
tmp=*x;
*x=*y;
*y=tmp;
}
int main()
{
int a=10;
int b=20;
swap2(&a,&b);//此處也是不同之處
printf("a= %d b=%d", a, b);
return 0;
}
而這個(gè)代碼運(yùn)行的結(jié)果就達(dá)到了我們想要的效果,這就是兩種調(diào)用的不同之處,傳值調(diào)用是將實(shí)際參數(shù)拷貝到函數(shù)的形式參數(shù)中,在經(jīng)過(guò)一系列運(yùn)算后得出結(jié)果,它注重的是返回值;而傳址調(diào)用則是直接將存放實(shí)際參數(shù)的地址傳遞給函數(shù),一般用于需要對(duì)函數(shù)參數(shù)自身改變的程序,如上面提到的交換兩個(gè)變量的值,這種調(diào)用一般來(lái)說(shuō)都是沒(méi)有返回值的。
當(dāng)我們?cè)诙x完一個(gè)函數(shù),要在主函數(shù)中去使用時(shí),我們?nèi)孕枰⒁庖粋€(gè)細(xì)節(jié),那就是在使用有返回值的函數(shù)時(shí)需要有一個(gè)變量去接收,而沒(méi)有返回值的函數(shù)就不需要考慮這個(gè)問(wèn)題了。
在聽(tīng)完對(duì)兩種調(diào)用的介紹后,相信大家對(duì)函數(shù)調(diào)用已經(jīng)有初步的認(rèn)識(shí)了,那么我們接下來(lái)看幾道關(guān)于函數(shù)調(diào)用的問(wèn)題:
1.寫(xiě)一個(gè)函數(shù)判斷一個(gè)數(shù)是否是素?cái)?shù)
2.寫(xiě)一個(gè)函數(shù)判斷一年是否是閏年
3.寫(xiě)一個(gè)函數(shù)實(shí)現(xiàn)一個(gè)整型有序數(shù)組的二分查找
4.寫(xiě)一個(gè)函數(shù),每調(diào)用一次,就會(huì)將變量"num"的值加一
由于篇幅有限,我這里就不給出以上問(wèn)題的詳解了,具體的習(xí)題集合我會(huì)之后專門(mén)出一個(gè)合集來(lái)介紹。以上問(wèn)題需要用到的函數(shù)調(diào)用方法分別是1~3:傳值調(diào)用,4:傳址調(diào)用。
而我們?cè)趯?shí)際的使用過(guò)程中還是遵循**“需要對(duì)函數(shù)參數(shù)自身改變的就用傳址調(diào)用;需要在運(yùn)算后得出一個(gè)新結(jié)果的就用傳值調(diào)用**”這一原則。
一句話,熟能生巧,用多了我們自然而然就會(huì)了
**函數(shù)的嵌套調(diào)用和鏈?zhǔn)皆L問(wèn)
** 函數(shù)與函數(shù)之間是可以有機(jī)結(jié)合的
嵌套調(diào)用
在函數(shù)中可以調(diào)用另一個(gè)函數(shù),這種方式叫嵌套調(diào)用。由于比較簡(jiǎn)單,這里就不舉例子了
鏈?zhǔn)皆L問(wèn)
把一個(gè)函數(shù)的返回值作為另一個(gè)函數(shù)的參數(shù)。這個(gè)概念同樣比較好理解,不過(guò)這里有個(gè)很有趣的例子
#include
int main()
{
printf("%d",printf("%d",printf("%d",43)));
//結(jié)果是啥???
return 0;
}
大家的第一反應(yīng)應(yīng)該都是認(rèn)為屏幕上會(huì)打印出“43 43 43”,但是在程序運(yùn)行后,屏幕上卻打印出了“4321”。問(wèn)題出在哪兒呢?原來(lái)c語(yǔ)言規(guī)定,printf的返回值就是它所打印的字符個(gè)數(shù),在上述例子中,最內(nèi)層的printf打印了“43”,所以它的返回值(就是2)成為了第二個(gè)printf的參數(shù),以此類推,屏幕上就打印出了上述的結(jié)果。
- 函數(shù)的聲明和定義
函數(shù)聲明 :
1.告訴編譯器有一個(gè)函數(shù)叫什么,參數(shù)是什么,返回類型是什么。但是具體是不是存在無(wú)關(guān)緊要。
2.函數(shù)的聲明一般出現(xiàn)在函數(shù)的使用之前。要滿足先聲明后使用。
3.函數(shù)的聲明一般要放在頭文件中。
函數(shù)定義 :
函數(shù)定義是指函數(shù)的具體實(shí)現(xiàn),交代函數(shù)的功能實(shí)現(xiàn)。
下面舉一個(gè)簡(jiǎn)單的函數(shù)聲明的例子:
int add(int ,int );
int main()
{
int a=10;
int b=20;
int sum =0;
sum=add(a,b);
printf("%d",sum);
return 0;
}
int add(int x,int y)
{
return (x+y);
}
如上述代碼所寫(xiě),我們先在程序最上面聲明了存在“add”這一函數(shù),所以程序在執(zhí)行時(shí)就不會(huì)報(bào)錯(cuò)。我們要知道的是,C語(yǔ)言在執(zhí)行時(shí)是從上到下依次執(zhí)行的。如果不事先聲明的話,在函數(shù)位于主函數(shù)后面的情況下去運(yùn)行,程序就會(huì)報(bào)錯(cuò)。
當(dāng)然我們聲明函數(shù)并不是用來(lái)寫(xiě)上面的代碼,這種寫(xiě)法非常睿智,我只是舉個(gè)函數(shù)聲明的例子。函數(shù)聲明更多情況下適用于一些比較復(fù)雜的程序,當(dāng)我們需要寫(xiě)一些復(fù)雜的代碼時(shí),由于多人分工,大家會(huì)分別負(fù)責(zé)不同的模塊,這時(shí)我們就可以創(chuàng)建多個(gè)源文件和對(duì)應(yīng)的頭文件分別進(jìn)行編程,在使用時(shí)就會(huì)方便很多了
好了,我們這期的內(nèi)容就結(jié)束了,祝大家新年快樂(lè)!
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
2975瀏覽量
73815 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4284瀏覽量
62325 -
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28306
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論