2010-04-06 16 views
19

मैं सी में सूचक के बारे में पूछना चाहता हूँ ++कार्यों के लिए ++ सूचक सी, शुरुआती प्रश्न

मैं कुछ सरल कोड है:

cout<<runner(2,5,&add); 
: अब

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

int runner(int x,int y, int (*functocall)(int, int)){ 
return (*functocall)(x,y); 
} 

, मैं इस तरह का उपयोग कर उन कार्यों फोन लगता है

या शायद

cout<<runner(2,5,add); 

कोई अंतर है? क्योंकि जब मैंने कोशिश की, तो परिणाम वही है और बिना किसी त्रुटि के।

धन्यवाद एक बहुत

उत्तर

0

मेरा मानना ​​है कि दूसरी कॉल स्वचालित रूप से संकलक में पहली कॉल पर ले कर ...

+0

तो आपका मतलब है, दूसरा कॉल सही है? – BobAlmond

+1

नहीं, मेरा मतलब है कि संकलक या तो एक फ़ंक्शन पॉइंटर को कॉल करता है, और यह वास्तव में वाक्य रचनात्मक वरीयता का मामला है। –

10

समारोह परोक्ष सी ++ स्टैंडर्ड (4.3/1) के अनुसार एक सूचक को casted की जाएगी। इसमें कोई फर्क नही है। हालांकि यह रूपांतरण गैरस्टिक सदस्य कार्यों पर कभी भी लागू नहीं होता है। उनके लिए आपको स्पष्ट रूप से & लिखना चाहिए।

3

कोई फर्क नहीं पड़ता। पॉइंटर प्राप्त करने के अन्य तरीकों के साथ स्थिरता के लिए आप & का उपयोग कर सकते हैं, लेकिन स्वयं के नाम का कोई अन्य अर्थ नहीं होगा, इसलिए इसका अर्थ यह है कि "पता प्राप्त करें"।

यह सरणी चर नामों के समान है जो सरणी के पहले तत्व के पते के रूप में कार्य करता है।

0

यह है कि ऐसी कोई वस्तु समारोह के रूप में (भाव के संदर्भ में) न होने के कारण, वहाँ केवल कार्यों के संकेत दिए गए हैं। जब आप अपने फ़ंक्शन में फ़ंक्शन पास करना चाहते हैं तो केवल एक चीज जिसे आप वास्तव में पास कर सकते हैं वह सूचक है, इसलिए संकलक आपके लिए

+0

फ़ंक्शंस नामक ऑब्जेक्ट्स हैं (अभिव्यक्तियों के संदर्भ में): 'add' ऐसी वस्तु है, इसका प्रकार 'int (int, int)' है। हालांकि वे कई संदर्भों में खुद को पॉइंटर्स के लिए पूरी तरह से क्षय करते हैं। – avakar

+0

कृपया उदाहरण दिखाएं जहां अभिव्यक्ति शब्द के रूप में कार्य करने के लिए फ़ंक्शन और पॉइंटर वास्तव में भिन्न हैं – Andrey

+0

हां, फ़ंक्शन ऑब्जेक्ट्स नहीं हैं, लेकिन वे फ़ंक्शन (आश्चर्य xD) हैं। उदाहरण के लिए 'शून्य एफ() {} शून्य (& fr)() = f; 'काम करता है क्योंकि f फ़ंक्शन प्रकार की अभिव्यक्ति है और आप इसके संदर्भ को बाध्य करते हैं, जबकि' शून्य (& fr)() = & f; 'नहीं है काम करें क्योंकि '& f' सूचक प्रकार की अभिव्यक्ति है। एक और उदाहरण - 'sizeof (f)' करने का प्रयास करें और ध्यान दें कि यह विफल रहता है, क्योंकि कार्यों का आकार नहीं है। @avakar की तरह, यहां एफ का प्रकार 'शून्य()' है, और जोड़ों में से एक है int (int, int) ' –

3

नहीं, इस विशेष मामले में कोई अंतर नहीं है। कोई भी आपको फ़ंक्शन का पता देता है।

हालांकि, ध्यान दें कि सी ++, एक सदस्य कार्य करने के लिए एक सूचक हो रही आवश्यकता है कि आप '&' ऑपरेटर का उपयोग।

1

सूचना आपको कार्यों

int runner(int x,int y, int (&functocall)(int, int)){ 
return functocall(x,y); 
} 

अब &add के साथ बुला अब काम नहीं करेगा के लिए संदर्भ हो सकता है क्योंकि आप एक सूचक के बजाय एक समारोह के लिए एक समारोह संदर्भ बाध्य करने के लिए प्रयास करें। कभी-कभी यह जब टेम्पलेट्स

template<typename T> 
int runner(int x,int y, T &functocall, T otherfunc){ 
return functocall(x,y) + otherfunc(y, x); 
} 

का उपयोग कर अब runner(10, 20, add, add) के साथ बुला क्योंकि T असफल हो जायेगी जब एक संदर्भ के लिए गुजर किया जाता है दोनों एक समारोह सूचक और एक समारोह प्रकार (एक सूचक करने के लिए कोई क्षय निष्कर्ष निकाला जा करने की कोशिश की है के माध्यम से चमकता पैरामीटर!)।

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