-
1 # 程式碼Go說科技
-
2 # 珞珈頑石
我們通過一個例項說明函式指標的作用。如果你想找到陣列中第一個和x相等的元素,這個程式不難實現,接下來我們希望找到陣列中第一個比x小的,或者再找第一個比x大的,再或者其他什麼和x具備可函式描述關係的第一個元素(比如互質)……沒錯,你發現我們可以“抽象”這個過程就是遍歷陣列,在符合“要求”元素的位置停下來。反而就是這個“要求”破壞了大家的共同點產生了差異。我們不能因為這點差異就為每一個差異寫一個函式吧。對那這個“要求”的“多型”我們如何滿足呢?(注:前面為了邏輯連貫沒有說明每一個不同功能的函式具備極大相似的函式宣告,即同樣的引數列表和返回資料型別)
解決問題的辦法就是把實現不同“要求”的函式傳遞進來在判定陣列元素和x關係的位置呼叫。這樣我們既複用了功能邏輯又兼顧了“要求”的變化需求。
看起來這是一個非常不錯的功能,程式設計語言們是如何實現的呢?C就是通過函式指標實現,C++可以和Java一樣通過介面實現,而像具備函數語言程式設計能力的python和JS更加簡單粗暴,函式是可以直接作為引數傳遞的!
說點題外話。相較於Java和很多新興面向物件程式設計語言,C++不讓人喜歡。因為一個面向物件的語言總是有C的影子,有些時候這些影子破壞了一些面向物件的東西。比如運算子過載,想想==和equals我更傾向後者,再比如檔案缺乏類這一級內容的封裝……當然,C和C++是底層程式實現者這足以使其具備存在價值以及擁有足夠多的粉絲,也依然可以保障它是程式設計師最佳入門語言的地位。
-
3 # 量子糾纏速度之謎
可以使得程式的擴縮性更強。例如我有N個動態庫,每個動態庫對應某項功能,但使用者只要M個功能,這時我只要將不需要的動態庫刪除就可以了,系統不需要重新編譯。如果使用者要增加某個功能,我就將該動態庫發給他即可。指標是C語言特有的,用好它可得到意想不到的效果。
-
4 # 外老師
函式指標的作用,和普通的變數作用是類似的!
有時候,我們需要呼叫的函式還沒確定的時候,就需要同過函式指標來約定我們需要呼叫的函式的格式。包括函式返回值,函式引數等等。
等到我們確定要呼叫的函式的時候,就可以把這個函式的地址傳過去,再進行呼叫。
不光是C++有函式指標!一般的程式語言,都提供了類似的機制。
C#中的委託和事件Java中的回撥函式JavaScript中隨處可見的回撥函式可以說這種函式指標,是我們處理軟體開發中的可變需求的一大利器!
樓主可能還沒有遇到過這種場景!如果你對此非常感興趣,可以深入學習瞭解一下!
可以不用太著急,如果你是從事軟體相關的工作的話,相信你很快就會遇到這種場景。
-
5 # 魚䲆鱂
可以作為回撥函式。只需要將函式指標作為引數傳給另一個函式,那麼另一個函式執行過程中或執行以後就可以通過這個指標呼叫預先設定好的使用者函數了。
回覆列表
使用Windows作業系統的API程式設計時,會經常用到函式指標。函式指標,顧名思義是指向函式的指標。使用它呼叫與直接呼叫函式名稱,只要是入參相同的情況下,執行的結果是一致的。
假設你開發了一個非常牛掰的應用程式,使用者群體非常大。程式中某重要且常用的功能用到了排序演算法,綜合考慮之後你採用了氣泡排序演算法。在推向市場後,取得非常好的反響,同時也有使用者給你反饋氣泡排序不適應他們的業務場景。經過深入調查得知,有30%左右的使用者改成直接排序,40%左右的使用者覺得快速排序更符合他們業務場景,10%左右的客戶想加入自己的想法自定義排序,對氣泡排序認可的客戶不到20%。此處宣告一下,上述假設只是為了說明函式指標的用法,實際情況有可能不符。
在C語言裡回撥函式能被內部函式呼叫的情況,具體實現是採用的函式指標。通過函式指標把使用者自定義的函式定義傳給內部函式,內部函式就能正確執行,並返回你想要的結果。在形式上,使用者的回撥函式一般採用DLL的方式。
C++語言兼具上述兩個語言的特點,既可以使用回撥函式的方式,也可以採用介面的方式(純虛擬函式),甚至兩者還可以混合使用。