簡體   English   中英

功能指針與函數調用有什么區別?

[英]What is the difference between Function Pointer vs Function Call?

你好朋友,
我如何使用函數指針數組?
如果我們將看到上面的鏈接,它會告訴我們函數指針是如何工作的。
現在的問題是我為什么要選擇函數指針?
為什么我不能直接使用函數調用?
我會用函數指針獲得什么好處?
例如

enum{a, b, c};
void A();
void B();
void C();
void (*fun[3])() = {A, B, C};

Now when I need to call a function I am doing like,
fun[a](); // This calls function A
// And so on...

同樣可以在函數調用中完成

就像我需要直接調用函數A,B或C.我可以這樣

A();
B();
or 
C();

那為什么function pointer

使用函數指針有很多原因,特別是在C中一般做事情。

您將看到它們被使用的主要位置是作為函數的參數。 例如,使用函數bsearch ,它使用比較函數作為函數指針傳遞,以比較項目並對數據進行排序:

void *bsearch(const void *key, const void *base,
                     size_t nmemb, size_t size,
                     int (*compar)(const void *, const void *));

這允許bsearch是通用的並且可以對任何類型的數據進行排序,因為只有該比較函數必須知道數據的類型。


另一個與避免多次檢查有關。 即。

void makePizza(void) { }

void bakeCake(void) { }

iWantPizza = 1;
...
if (iWantPizza)
   makePizza();
else
   bakeCake();
/* want to call the same function again... */
if (iWantPizza)
   makePizza();
else
   bakeCake();

..

/* alternative */
void (*makeFood)(void) = iWantPizza ? makePizza : bakeCake;

makeFood();
/* want to call the same function again... */
makeFood();

對於您展示的示例,還可以做一件事。

可以說有一些功能需要為某些設備操作運行。 以簡單的方式,您可以在另一個主函數中編寫所有函數調用並調用該主函數。

另一種方法是,將所有函數名稱寫在大括號中,並使用函數指針和循環調用每個函數名稱。 這看起來很聰明。 我不確定這對你有什么幫助,但我在linux內核代碼中看到了這一點。


我同意這里的所有答案。 除此之外,我有一些自己的判斷來使用函數指針。

讓我們舉一些復雜的數學計算的例子(比如打印Fibonacci,集成,傅立葉Xform等等)。

你有一個在你的程序中多次使用的函數FX(它執行復雜的數學計算或其他任何事情)。 此功能用於許多不同的工作。

使用你的程序幾個月之后,你會發現,對於某些工作,你可以改進功能,對於某些人來說,當前最好。 你會做什么? 編寫一個新函數,去所有地方更改函數名稱。

每次你找到更好的東西,你都會這樣做。

相反,使用不同的函數指針進行不同的工作。 在初始階段,所有指針都可以指向一個函數。 當您發現某項工作的更好功能時,只需轉移指針即可完成。


采取另一種方案。 在這里,你有一個真正的大代碼,如手機操作系統。 (不是完全開放但是一半編譯)。 您需要為特定硬件添加藍牙驅動程序。

現在,您可以添加或者您可以離開是OS中可用的選項。

您可能需要從許多地方打開/關閉藍牙。

操作系統所做的是,它創建了一個函數指針,可以將藍牙打開並在需要的地方使用它。 此代碼已編譯,因此您無法在其中添加代碼。 但是可以做的是,你可以編寫函數並使指針指向你的函數。

這是我在Android OS下已經看到的。 (不完全但更接近)

現在的問題是我為什么要選擇函數指針?
我會用函數指針獲得什么好處?

您需要實現異步機制時使用函數指針。
事情發生時,你需要異步調用一個函數。
你怎么知道要調用哪個函數?
每個函數的地址都是唯一的,所以你需要使用和存儲函數地址。
你在哪里存儲這個功能地址?
一個函數指針

根據我的經驗,函數指針主要用於將函數作為參數傳遞給另一個函數。

看看你的代碼,它們也可以像數組一樣使用,所以你可以遍歷整個數組(可能包含數百個函數指針),它只會執行它們。

功能指針與函數調用有什么區別?

這就像要求編譯器“告訴我國家美術館的地址(我可能想稍后去那里,我想做好准備)”之間的區別,而不是“現在帶我去國家美術館”(但我不會注意你是怎么把我送到那里所以不要指望我后來知道)“。 至關重要的是,如果你要求地址/指針,你可以在某個地方寫下來,比如“下周日下午的大旅行”......你甚至不必記住它是你要去的國家美術館 - 當你到達那里時,這可能是一個驚喜 - 但你立即知道你周日的娛樂活動全部排序。

使用函數指針可以獲得什么好處?

好吧,如上所述,在你設置功能指針的時候,你需要決定你以后打電話的地方,但是你可以忘記做出決定的所有原因,只知道后來的目的地都准備好了。 。 當你實際做的事情......“我的星期天例行公事:睡到10點,吃一頓豐盛的早餐,回去睡覺,洗澡,如果我有足夠的錢,那就去我星期天下午的大旅行,和朋友一起吃晚飯“......早先的決定只是為了讓你去畫廊。 至關重要的是,你可以繼續使用你熟悉的星期日時間表並開始“指點”下一個星期天下午的大旅行地址/指針,因為它們引起你​​的注意,即使它們在你的總體時間表形成時不存在。

你可以看到這種事實上的靈活性,可以通過AusCBloke提到的bsearch在舊例程中將調度目標更改為一步。 qsort是另一個經典的例子 - 它知道有效排序任意事物數組的大圖邏輯,但必須告訴它去哪里比較你實際使用它的兩個東西。

函數指針是指針(如變量指針),它指向函數的地址。 當你像函數調用那樣取消引用它們時,它們實際上調用了底層函數。

函數指針的主要優點是你可以將它作為參數傳遞給另一個函數 ,例如......

這些都是很好的例子,特別是在Urvish上面的第一個例子。 我想知道同樣的事情,我認為答案純粹是設計。 在我看來,它們是相同的結果,因為你可以指向一個函數並得到一個+ b,或者你可以定期調用一個函數並得到一個+ b,並且通過SO上的例子,它們通常是小而瑣碎的為了說明。 但是 ,如果一個人有一個10k的C系列程序,並且你因為你做了一個改變而不得不改變了五十次,那么你可能很快就會選擇使用函數指針的原因。

它還使您欣賞OOP語言的設計和OOD背后的哲學。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM