इसके लिए कुछ टुकड़े हैं जो इन सभी संचालकों को समान तरीके से काम करने की अनुमति देते हैं।
इन सभी कार्यों का मूल कारण यह है कि एक फ़ंक्शन (जैसे foo
) फ़ंक्शन के लिए एक सूचक के लिए अनुमानित रूप से परिवर्तनीय है। यही कारण है कि void (*p1_foo)() = foo;
काम करता है: foo
अंतर्निहित रूप से एक सूचक में खुद को बदल दिया जाता है और उस सूचक को सौंपा जाता है p1_foo
।
&
जब एक फ़ंक्शन पर लागू किया जाता है, तो यूनरी फ़ंक्शन को पॉइंटर देता है, जैसे कि यह किसी ऑब्जेक्ट के पते को उत्पन्न करता है जब इसे किसी ऑब्जेक्ट पर लागू किया जाता है। साधारण कार्यों के संकेत के लिए, यह अंतर्निहित फ़ंक्शन-टू-फ़ंक्शन-पॉइंटर रूपांतरण के कारण हमेशा बेमानी है। किसी भी मामले में, यही कारण है कि void (*p3_foo)() = &foo;
काम करता है।
*
एक फ़ंक्शन पॉइंटर पर लागू होने वाली यूनरी , पॉइंट-टू-फंक्शन को पैदावार देती है, ठीक उसी तरह जैसे कि पॉइंट-टू ऑब्जेक्ट तब मिलता है जब इसे किसी ऑब्जेक्ट को साधारण पॉइंटर पर लगाया जाता है।
इन नियमों को जोड़ा जा सकता है। अपने दूसरे से अंतिम उदाहरण पर विचार करें **foo
:
- सबसे पहले,
foo
संक्षेप में खुद को एक पॉइंटर में बदल दिया जाता है और पहले *
उस फ़ंक्शन पॉइंटर पर लागू किया जाता है, foo
फिर से फ़ंक्शन को पैदावार देता है ।
- फिर, परिणाम को फिर से एक सूचक में स्वयं में बदल दिया जाता है और दूसरा
*
लागू किया जाता है, फिर से समारोह में उपज foo
।
- इसके बाद इसे फिर से फंक्शन पॉइंटर में बदल दिया जाता है और वेरिएबल को असाइन किया जाता है।
आप जितने चाहें उतने जोड़ सकते हैं *
, परिणाम हमेशा एक जैसा होता है। अधिक *
एस, मर्जर।
हम आपके पांचवें उदाहरण पर भी विचार कर सकते हैं &*foo
:
- सबसे पहले,
foo
संक्षेप में खुद को एक सूचक में बदल दिया जाता है; यूरी *
को foo
फिर से लागू किया जाता है ।
- फिर, एक पॉइंटर को पैदावार
&
करने के लिए लागू किया foo
जाता है foo
, जिसे चर को सौंपा गया है।
&
केवल हालांकि, एक समारोह है कि एक समारोह सूचक में बदल दिया गया (नहीं एक समारोह को लागू किया जा सकता है जब तक, ज़ाहिर है, समारोह सूचक एक चर, जिस स्थिति में परिणाम एक सूचक-टु-ए-pointer- है एक समारोह में, उदाहरण के लिए, आप अपनी सूची में जोड़ सकते हैं void (**pp_foo)() = &p7_foo;
)।
यही कारण है कि &&foo
काम नहीं करता है: &foo
एक कार्य नहीं है; यह एक फंक्शन पॉइंटर है जो एक रव्यू है। हालाँकि, &*&*&*&*&*&*foo
काम करेगा, जैसा कि होगा &******&foo
, क्योंकि उन दोनों अभिव्यक्तियों में &
हमेशा एक फ़ंक्शन पर लागू किया जाता है, न कि किसी फ़ंक्शन फ़ंक्शन सूचक के लिए।
यह भी ध्यान दें कि आपको *
फ़ंक्शन पॉइंटर के माध्यम से कॉल करने के लिए यूनिरी का उपयोग करने की आवश्यकता नहीं है ; दोनों (*p1_foo)();
और (p1_foo)();
एक ही परिणाम है, फिर से फ़ंक्शन-टू-फ़ंक्शन-पॉइंटर रूपांतरण के कारण।
&foo
पता चलता हैfoo
, जिसके परिणामस्वरूप एक फ़ंक्शन पॉइंटर इंगित होता हैfoo
, जैसा कि कोई अपेक्षा करता है।