2011-09-22 9 views
14

संभव डुप्लिकेट:
How does dereferencing of a function pointer happen?समारोह सूचक - स्वचालित अपसंदर्भन

void myprint(char* x) { 
     printf("%s\n", x); 
    } 

    int main() { 
    char* s = "hello"; 
    void (*test)(char*); 
    void (*test2)(char*); 

    test = myprint; 
    test2 = &myprint; 

    test(s); 
    (*test)(s); 
    test2(s); 
    (*test2)(s); 

    } 

किसी को भी मेरे लिए व्याख्या कर सकते हैं क्यों उपरोक्त कोड के सभी मान्य है? "हैलो" चार बार मुद्रित है। फ़ंक्शन पॉइंटर को लागू करके, क्या यह पूरी तरह से खराब हो गया है? असल में मैं जानना चाहता हूं कि फ़ंक्शन पॉइंटर्स वास्तव में कैसे संग्रहीत होते हैं, क्योंकि उपर्युक्त भ्रमित है।

+0

'(****** परीक्षण) (ओं)' भी मान्य है :-) – sidyll

+1

इस पिछले प्रश्न को देखें: http://stackoverflow.com/questions/2795575/how-does-Dereferencing-of-a -फंक्शन-पॉइंटर-हो –

+1

कार्य और फ़ंक्शन पॉइंटर्स विशेष हैं, उनके उपचार किसी अन्य प्रकार के पॉइंटर के साथ वर्दी में नहीं हैं। देखें [फ़ंक्शन पॉइंटर का डिफ्रेंसिंग कैसे होता है?] (Http://stackoverflow.com/q/2795575/2509) और साइडबार में अन्य प्रश्न। – dmckee

उत्तर

26

यह सी का सिर्फ एक प्रश्न है। सी कोई मानक नहीं है, लेकिन सी मानक सिर्फ यह कहता है कि फ़ंक्शन का पता लगाना या उस फ़ंक्शन का पता लेना सिर्फ उस फ़ंक्शन के पॉइंटर का मूल्यांकन करता है, और फ़ंक्शन पॉइंटर को डिफ्रेंस करने से बस मूल्यांकन होता है फ़ंक्शन पॉइंटर

यह व्यवहार (इस प्रकार स्पष्ट रूप से) यूनरी & और * ऑपरेटर सामान्य चर के लिए कैसे काम करता है उससे बहुत अलग है।

तो,

test2 = myprint; 
test2 = &myprint; 
test2 = *myprint; 
test2 = **********myprint; 

सभी बस करो बिल्कुल वैसा ही है, तो आप myprint

इसी तरह करने के लिए एक समारोह सूचक,

test2(s); 
(*test2)(s); 
(***********test2)(s); 

एक ही है, में संग्रहीत समारोह सूचक फोन करता है देता है test2। क्योंकि सी कहते हैं कि यह करता है।

संबंधित मुद्दे