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