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