當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 函數(shù)與指針專(zhuān)題
數(shù)組指針專(zhuān)題中給大家講解了數(shù)組與指針相結(jié)合的各種表現(xiàn)形式,那么在來(lái)看看函數(shù)與指針結(jié)合會(huì)有什么樣的意想不到的情況呢?
我們?cè)趯W(xué)習(xí)函數(shù)之前必須知道一點(diǎn),那就是函數(shù)名代表了函數(shù)的入口地址。想想我們前面的對(duì)數(shù)據(jù)的各種操作,知道了地址是不是就可以去訪(fǎng)問(wèn)它了啊。
一、總體框架圖:
二、函數(shù)與指針
2.1函數(shù)
執(zhí)行結(jié)果:
上面是咱們自己封裝的一個(gè)函數(shù),它的功能很簡(jiǎn)單,就是比較兩個(gè)數(shù)的大小,并且返回大值。還有一點(diǎn)是需要注意的,函數(shù)里面的定義的變量都是保存在棧上,函數(shù)調(diào)用完畢,棧空間被釋放(可以簡(jiǎn)單這么認(rèn)為)。
但是存放變量的數(shù)據(jù)的那個(gè)單元格其實(shí)還在那里,只是我們不知道那個(gè)單元格的地址而已,所以我們就不能夠訪(fǎng)問(wèn),此時(shí)那個(gè)單元格的數(shù)據(jù)就稱(chēng)為臟數(shù)據(jù)。只到你下次cpu還為你分配這個(gè)段元格,你為其重新賦值,那么才會(huì)被改變。所以我們定義變量的時(shí)候應(yīng)該為其進(jìn)行初始化。
2.2 指針函數(shù)
指針函數(shù),還是依照我們我們的小學(xué)的語(yǔ)文知識(shí)來(lái)分析它,定語(yǔ)是函數(shù),修飾詞是指針。直白的說(shuō)指針函數(shù)的本質(zhì)是一個(gè)函數(shù),是函數(shù)就有返回值,它的返回值和別人稍微有點(diǎn)不一樣是一個(gè)指針。我們這么分析之后,那么它的原型也就呼之欲出了。
執(zhí)行結(jié)果:
其實(shí),我這個(gè)程序我們有不規(guī)范的地方,我們一般都不這么用的,因?yàn)樵蹅兊淖兞繒r(shí)在ret,空間被分配在了棧上,那么棧的空間是有限的,系統(tǒng)還會(huì)復(fù)用。所以不建議這么寫(xiě)。我這么寫(xiě)是對(duì)我上一個(gè)例子的驗(yàn)證。
執(zhí)行結(jié)果:
p指針變量本身是在棧區(qū)分配空間的,malloc 分配的空間是在堆區(qū)的。
2.3函數(shù)指針
函數(shù)指針我們這么來(lái)解釋它,本質(zhì)是一個(gè)指針,前面的修飾語(yǔ)是函數(shù),也就是這個(gè)指針比較特別,它指向的不是一個(gè)整數(shù)或者是char型的數(shù)據(jù),而是一個(gè)函數(shù),你仔細(xì)的想想,其實(shí)也是一件很普通的事情。知道了意思,那么還有一個(gè)問(wèn)題我們是要解決的,那就是函數(shù)怎么來(lái)申明函數(shù)指針的類(lèi)型呢。這里和數(shù)組指針的申明方法是一樣的,對(duì)函數(shù)名加上括號(hào)加*號(hào)就ok。
執(zhí)行結(jié)果:
2.4 函數(shù)指針函數(shù)
函數(shù)指針函數(shù),本質(zhì)是一個(gè)函數(shù),返回值是一個(gè)函數(shù)指針。依據(jù)這樣一個(gè)定義我們來(lái)列舉這樣一個(gè)例子。因?yàn)榉祷刂凳且粋(gè)函數(shù)指針的情況并不多,我們就不進(jìn)行詳細(xì)分析了,感興趣的同學(xué),可以按照我上面的思路,自己分析一下。
2.5 函數(shù)指針數(shù)組
執(zhí)行結(jié)果:
分析:
函數(shù)指針數(shù)組,本質(zhì)是一個(gè)數(shù)組,數(shù)組中的每個(gè)元素,是一個(gè)函數(shù)指針。每個(gè)函數(shù)指針指向一個(gè)函數(shù)。那么函數(shù)指針數(shù)組。咱們指針難道了函數(shù)名,也就是函數(shù)的地址。調(diào)用它,就是把類(lèi)型去掉即可
2.6 回調(diào)函數(shù)
回調(diào)函數(shù)是什么呢?大家想一想我們?cè)谀男┑胤接龅剿四兀繑?shù)據(jù)庫(kù)的callback函數(shù),還有哪里?線(xiàn)程的創(chuàng)建函數(shù)。那么現(xiàn)在我們來(lái)寫(xiě)一個(gè)自己的回調(diào)函數(shù)。重點(diǎn)弄明白原理。
執(zhí)行結(jié)果:
回調(diào)函數(shù),本質(zhì)是要在一個(gè)函數(shù)中調(diào)用另外一個(gè)函數(shù)。那么我們很容易想到的是,需要得到這個(gè)函數(shù)的入口地址,我們只需要傳參的時(shí)候,傳遞函數(shù)名即可。這樣就可以實(shí)現(xiàn)回調(diào)了,但是還是不夠靈活,還需要我們給這個(gè)被調(diào)用的函數(shù)的傳參啊,于是第2個(gè)參數(shù),第3個(gè)參數(shù)緊接著就出現(xiàn)了。