0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

函數(shù)與遞歸-2

汽車電子技術(shù) ? 來源:微亮筆記 ? 作者: PASSION ? 2023-02-21 15:53 ? 次閱讀

書接上回圖片圖片

上期主要是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ù)的形參和實(shí)參分別占有不同的內(nèi)存塊,對形參的修改不會影響實(shí)參

** 傳址調(diào)用

** 傳址調(diào)用是把函數(shù)外部創(chuàng)建變量的內(nèi)存地址傳遞給函數(shù)參數(shù)的一種調(diào)用函數(shù)的方式

此傳參方式可以讓函數(shù)和函數(shù)外面的變量建立起真正的聯(lián)系。也就是說,函數(shù)內(nèi)部可以直接操作函數(shù)外部的變量。

只聽定義會一頭霧水,接下來我為大家提供一個(gè)具體問題來方便大家感受兩種調(diào)用的區(qū)別。

 應(yīng)用:**【給出兩個(gè)變量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;
}
而這個(gè)代碼運(yùn)行的結(jié)果就達(dá)到了我們想要的效果,這就是兩種調(diào)用的不同之處,傳值調(diào)用是將實(shí)際參數(shù)拷貝到函數(shù)的形式參數(shù)中,在經(jīng)過一系列運(yùn)算后得出結(jié)果,它注重的是返回值;而傳址調(diào)用則是直接將存放實(shí)際參數(shù)的地址傳遞給函數(shù),一般用于需要對函數(shù)參數(shù)自身改變的程序,如上面提到的交換兩個(gè)變量的值,這種調(diào)用一般來說都是沒有返回值的。

當(dāng)我們在定義完一個(gè)函數(shù),要在主函數(shù)中去使用時(shí),我們?nèi)孕枰⒁庖粋€(gè)細(xì)節(jié),那就是在使用有返回值的函數(shù)時(shí)需要有一個(gè)變量去接收,而沒有返回值的函數(shù)就不需要考慮這個(gè)問題了。

在聽完對兩種調(diào)用的介紹后,相信大家對函數(shù)調(diào)用已經(jīng)有初步的認(rèn)識了,那么我們接下來看幾道關(guān)于函數(shù)調(diào)用的問題:

1.寫一個(gè)函數(shù)判斷一個(gè)數(shù)是否是素?cái)?shù)

2.寫一個(gè)函數(shù)判斷一年是否是閏年

3.寫一個(gè)函數(shù)實(shí)現(xiàn)一個(gè)整型有序數(shù)組的二分查找

4.寫一個(gè)函數(shù),每調(diào)用一次,就會將變量"num"的值加一

由于篇幅有限,我這里就不給出以上問題的詳解了,具體的習(xí)題集合我會之后專門出一個(gè)合集來介紹。以上問題需要用到的函數(shù)調(diào)用方法分別是1~3:傳值調(diào)用,4:傳址調(diào)用。

而我們在實(shí)際的使用過程中還是遵循**“需要對函數(shù)參數(shù)自身改變的就用傳址調(diào)用;需要在運(yùn)算后得出一個(gè)新結(jié)果的就用傳值調(diào)用**”這一原則。

一句話,熟能生巧,用多了我們自然而然就會了圖片圖片

**函數(shù)的嵌套調(diào)用和鏈?zhǔn)皆L問

** 函數(shù)與函數(shù)之間是可以有機(jī)結(jié)合的

嵌套調(diào)用

在函數(shù)中可以調(diào)用另一個(gè)函數(shù),這種方式叫嵌套調(diào)用。由于比較簡單,這里就不舉例子了圖片圖片

鏈?zhǔn)皆L問

把一個(gè)函數(shù)的返回值作為另一個(gè)函數(shù)的參數(shù)。這個(gè)概念同樣比較好理解,不過這里有個(gè)很有趣的例子圖片圖片

#include
int main()
{
  printf("%d",printf("%d",printf("%d",43)));
  //結(jié)果是啥???
  return 0;
}

大家的第一反應(yīng)應(yīng)該都是認(rèn)為屏幕上會打印出“43 43 43”,但是在程序運(yùn)行后,屏幕上卻打印出了“4321”。問題出在哪兒呢?原來c語言規(guī)定,printf的返回值就是它所打印的字符個(gè)數(shù),在上述例子中,最內(nèi)層的printf打印了“43”,所以它的返回值(就是2)成為了第二個(gè)printf的參數(shù),以此類推,屏幕上就打印出了上述的結(jié)果。

  • 函數(shù)的聲明和定義

函數(shù)聲明

1.告訴編譯器有一個(gè)函數(shù)叫什么,參數(shù)是什么,返回類型是什么。但是具體是不是存在無關(guān)緊要。

2.函數(shù)的聲明一般出現(xiàn)在函數(shù)的使用之前。要滿足先聲明后使用。

3.函數(shù)的聲明一般要放在頭文件中。

函數(shù)定義

函數(shù)定義是指函數(shù)的具體實(shí)現(xiàn),交代函數(shù)的功能實(shí)現(xiàn)。

下面舉一個(gè)簡單的函數(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í)行時(shí)就不會報(bào)錯(cuò)。我們要知道的是,C語言在執(zhí)行時(shí)是從上到下依次執(zhí)行的。如果不事先聲明的話,在函數(shù)位于主函數(shù)后面的情況下去運(yùn)行,程序就會報(bào)錯(cuò)。

當(dāng)然我們聲明函數(shù)并不是用來寫上面的代碼,這種寫法非常睿智,我只是舉個(gè)函數(shù)聲明的例子。函數(shù)聲明更多情況下適用于一些比較復(fù)雜的程序,當(dāng)我們需要寫一些復(fù)雜的代碼時(shí),由于多人分工,大家會分別負(fù)責(zé)不同的模塊,這時(shí)我們就可以創(chuàng)建多個(gè)源文件和對應(yīng)的頭文件分別進(jìn)行編程,在使用時(shí)就會方便很多了圖片圖片

好了,我們這期的內(nèi)容就結(jié)束了,祝大家新年快樂!圖片圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2947

    瀏覽量

    73729
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4260

    瀏覽量

    62228
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    609

    瀏覽量

    28288
收藏 人收藏

    評論

    相關(guān)推薦

    32-代碼復(fù)用與函數(shù)遞歸-2

    編程語言代碼行業(yè)芯事經(jīng)驗(yàn)分享
    硬件天空
    發(fā)布于 :2022年05月30日 14:26:40

    數(shù)據(jù)結(jié)構(gòu)與算法:1-4-1-函數(shù)遞歸(2)#結(jié)構(gòu)數(shù)據(jù)

    數(shù)據(jù)結(jié)構(gòu)與算法
    學(xué)習(xí)硬聲知識
    發(fā)布于 :2022年12月18日 10:15:11

    《C Primer Plus》讀書筆記——遞歸

    本帖最后由 cugwyman 于 2017-2-5 20:14 編輯 遞歸的原理一個(gè)函數(shù)調(diào)用其本身,此調(diào)用過程為遞歸(recursion)。
    發(fā)表于 02-05 20:06

    LabVIEW遞歸

    感受到了遞歸的復(fù)雜和重要性。在愛因斯坦這一問題中,程序設(shè)計(jì)的時(shí)候反復(fù)遞歸,一個(gè)遞歸函數(shù)再調(diào)用另外一個(gè)遞歸
    發(fā)表于 02-19 11:52

    Labview遞歸函數(shù)的使用案例

    Labview遞歸函數(shù)的使用案例,簡單的1+2+3...+100求和,簡單易懂,充分理解遞歸函數(shù)的思想
    發(fā)表于 10-09 09:37

    C++教程之函數(shù)遞歸調(diào)用

    C++教程之函數(shù)遞歸調(diào)用 在執(zhí)行函數(shù) f 的過程中,又要調(diào)用 f 函數(shù)本身,稱為函數(shù)遞歸調(diào)
    發(fā)表于 05-15 18:00 ?35次下載

    遞歸指的是在函數(shù)的定義中使用函數(shù)自身的方法

    C語言支持遞歸,即一個(gè)函數(shù)可以調(diào)用其自身。但在使用遞歸時(shí),程序員需要注意定義一個(gè)從函數(shù)退出的條件,否則會進(jìn)入死循環(huán)。遞歸
    的頭像 發(fā)表于 11-12 15:06 ?7047次閱讀

    C++的實(shí)驗(yàn)教程之函數(shù)遞歸算法資料免費(fèi)下載

    函數(shù)遞歸算法 1.范例:求組合數(shù), 一、實(shí)驗(yàn)?zāi)康?. 學(xué)會解決簡單的遞歸算法。2. 掌握函數(shù)的嵌套調(diào)用。
    發(fā)表于 01-29 10:51 ?2次下載
    C++的實(shí)驗(yàn)教程之<b class='flag-5'>函數(shù)</b>的<b class='flag-5'>遞歸</b>算法資料免費(fèi)下載

    C語言-內(nèi)聯(lián)函數(shù)、遞歸函數(shù)、指針函數(shù)

    這篇文章介紹C語言的內(nèi)聯(lián)函數(shù)、遞歸函數(shù)函數(shù)指針、指針函數(shù)、局部地址、const關(guān)鍵字、extern關(guān)鍵字等知識點(diǎn);這些知識點(diǎn)在實(shí)際項(xiàng)目開發(fā)
    的頭像 發(fā)表于 08-14 10:03 ?1611次閱讀

    遞歸代碼都轉(zhuǎn)為非遞歸可以嗎

    之所以所有的遞歸都能轉(zhuǎn)為迭代算法是因?yàn)?b class='flag-5'>遞歸借助函數(shù)調(diào)用,函數(shù)調(diào)用本身就是基于調(diào)用棧這種結(jié)構(gòu)實(shí)現(xiàn)的,只不過這一切都是自動(dòng)完成的,我們當(dāng)然也可以用代碼手動(dòng)模擬出來。
    的頭像 發(fā)表于 02-17 14:35 ?697次閱讀
    <b class='flag-5'>遞歸</b>代碼都轉(zhuǎn)為非<b class='flag-5'>遞歸</b>可以嗎

    Python支持遞歸函數(shù)

    Python支持遞歸函數(shù)——即直接或間接地調(diào)用自身以進(jìn)行循環(huán)的函數(shù)遞歸是頗為高級的話題,并且它在Python中相對少見。然而,它是一項(xiàng)應(yīng)該了解的有用的技術(shù),因?yàn)樗试S程序遍歷擁有任意
    的頭像 發(fā)表于 02-21 14:28 ?601次閱讀

    函數(shù)遞歸-3

    程序調(diào)用自身的編程技巧稱為遞歸(recursion)。遞歸作為一種算法在程序設(shè)計(jì)語言中廣泛應(yīng)用。一個(gè)過程或函數(shù)在其定義或說明中有直接或間接調(diào)用自身的一種方法,它通常把一個(gè)大型復(fù)雜的問題層層轉(zhuǎn)化為一個(gè)
    的頭像 發(fā)表于 02-21 15:57 ?533次閱讀

    什么是Python的遞歸函數(shù)

    遞歸函數(shù)必須有終止條件。編程中,函數(shù)的調(diào)用要占用名叫棧(stack)的內(nèi)存空間。調(diào)用函數(shù)時(shí),程序會將相關(guān)的數(shù)據(jù)存儲到計(jì)算機(jī)的棧里。
    的頭像 發(fā)表于 02-23 10:25 ?1729次閱讀

    C語言,你真的懂遞歸了嗎?

    要說到遞歸如果不說棧的話,我覺得有點(diǎn)不合適,遞歸特點(diǎn)就是不斷的調(diào)用同一個(gè)函數(shù),如果這個(gè)函數(shù)沒有一個(gè)遞歸界限,那么就是死循環(huán)了,所以討論
    的頭像 發(fā)表于 06-06 15:24 ?927次閱讀
    C語言,你真的懂<b class='flag-5'>遞歸</b>了嗎?

    關(guān)于C語言中的遞歸

    遞歸指的是在函數(shù)的定義中使用函數(shù)自身的方法。
    發(fā)表于 02-26 10:34 ?307次閱讀
    關(guān)于C語言中的<b class='flag-5'>遞歸</b>