2009-11-24 11 views
24

क्या सी में किसी फ़ंक्शन के लिए फ़ंक्शन पॉइंटर को तर्क के रूप में पास करना संभव है?एक तर्क के रूप में फंक्शन पॉइंटर

यदि हां, तो मैं एक फ़ंक्शन पॉइंटर को तर्क के रूप में कैसे घोषित करता हूं और परिभाषित करता हूं?

उत्तर

49

निश्चित रूप से।

void f(void (*a)()) { 
    a(); 
} 

void test() { 
    printf("hello world\n"); 
} 

int main() { 
    f(&test); 
    return 0; 
} 
+3

बदलें च (परीक्षण) के लिए कॉल; –

+6

दोनों काम करेंगे। एम्परसेंड वैकल्पिक है। तो जब आप फंक्शन पॉइंटर को कॉल कर रहे हों तो पॉइंटर को डिफ्रेंस कर रहा है। –

+0

सच है, कुछ भी बदलने की जरूरत नहीं है। इसके अलावा, पैरामीटर घोषणा में भी "सूचक" वाक्यविन्यास वैकल्पिक है। उपर्युक्त 'एफ' को 'शून्य एफ (शून्य ए()) के रूप में घोषित किया जा सकता था। – AnT

20

Let पर रखने का सुझाव देते कहते हैं कि तुम समारोह

int func(int a, float b); 

तो सूचक को यह तुलना में आप इस्तेमाल कर सकते हैं

int (*func_pointer)(int, float); 

तो होगा यह

पसंद है
func_pointer = func; 
    (*func_pointer)(1, 1.0); 

    /*below also works*/ 
    func_pointer(1, 1.0); 

पूर्ण सूचक प्रकार हर बार जब आप इसकी आवश्यकता को निर्दिष्ट से बचने के लिए आप इसे typedef coud

typedef int (*FUNC_PTR)(int, float); 

और की तुलना में किसी भी अन्य प्रकार की तरह का उपयोग

void executor(FUNC_PTR func) 
{ 
    func(1, 1.0); 
} 

int silly_func(int a, float b) 
{ 
    //do some stuff 
} 

main() 
{ 
    FUNC_PTR ptr; 
    ptr = silly_func; 
    executor(ptr); 
    /* this should also wotk */ 
    executor(silly_func) 
} 

मैं दुनिया भर में मशहूर C faqs पर रखने का सुझाव देते ।

2

चेक qsort()

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

कार्य करने के लिए अंतिम तर्क एक समारोह सूचक है। जब आप अपने प्रोग्राम में qsort() पर कॉल करते हैं, तो उस पॉइंटर के उपयोग के माध्यम से निष्पादन "लाइब्रेरी में जाता है" और "अपने कोड में वापस कदम उठाएं"।

5

एक अच्छा उदाहरण:

#include <iostream> 
using namespace std; 

int sum(int a, int b) 
{ 
    return a + b; 
} 

int mul(int a, int b) 
{ 
    return a * b; 
} 

int div(int a, int b) 
{ 
    return a/b; 
} 

int mathOp(int (*OpType)(int, int), int a, int b) 
{ 
    return OpType(a, b); 
} 

int main() 
{ 

    cout << mathOp(sum, 10, 12) << ", " << mathOp(div, 10, 2) << endl; 
    return 0; 
} 

उत्पादन होता है: '22, 5 '