अभिव्यक्ति func(id)
एक फ़ंक्शन को एक पॉइंटर देता है जो एक फ्लोट को तर्क के रूप में लेता है और एक फ्लोट देता है।
float(*f)(float v); // pointer to a function
float val;
f = func(3); // returns a pointer to a function
val = (*f)(3.14); // calls the function pointed to with argument 3.14
बेशक
, आप पिछले बयान को फिर से लिखने सकता है:
val = (*func(3))(3.14); // take the ptr returned by func(3) and call the function pointed to.
आप की तरह एक समारोह है, तो:
float fct1 (float v) { return 2.0f*v+3.1f; }
आप लिख सकते हैं:
f = fct1; // reassign the pointer to function f to the adress of fct1
लेट्स वाक्यविन्यास को देखो। सी 11 मानक (मसौदा एन 1570) 6.5.2.2 बिंदु 1 में बताता है: "अभिव्यक्ति जो फ़ंक्शन को इंगित करता है) में" "और बिंदु 3 में कार्य करने के लिए टाइप पॉइंटर होगा: " एक पोस्टफिक्स अभिव्यक्ति कोष्ठक के बाद() अभिव्यक्तियों की संभावित रूप से खाली, अल्पविराम से अलग सूची वाली एक फ़ंक्शन कॉल है। "
यह सामान्य मामलों निश्चित रूप से शामिल किया गया है:
val = fct1 (3.14); // fct1 is the function designator which adresses the function
val = (*f) (3.14); // (*f) the dereferenced function pointer, so it addresses the function
लेकिन निम्न मानक के अनुसार भी मान्य है:
val = f(3.14); // This works as well, because f is a pointer to a function
val = func(3)(3.14) // works also because func(3) is a pointer to a function
हालांकि पहली अभिव्यक्ति मानव पाठक के लिए अस्पष्ट है, जो सोच सकते हैं फंक्शन डिज़ाइनर के रूप में एफ की, इसे कहीं परिभाषित करने की उम्मीद है। और दूसरा असामान्य भी है। इसके अलावा, सी के पुराने संस्करणों ने उन्हें पहचान नहीं लिया था। 1 9 78 के लिए मेरे के & आर संस्करण को फ़ंक्शन पॉइंटर को कॉल करने के लिए फॉर्म (* f)() की आवश्यकता होती है।
एक अंतिम वाक्य रचनात्मक टिप्पणी: यदि आप float *f (float);
के रूप में एफ को परिभाषित करेंगे तो इसे किसी फ़ंक्शन के सूचक के रूप में नहीं समझा जाएगा, लेकिन एक सादा फ़ंक्शन की अगली घोषणा के रूप में जिसे एफ कहा जाता है और फ्लोट करने के लिए पॉइंटर लौटाता है। क्यूं कर ?क्योंकि C precedence rules()
देना अर्थ *
की तुलना में एक higer पूर्वता कि संकलक (float *)(f(float))
के रूप में यह समझना होगा। यही कारण है कि एक स्पष्ट कोष्टक पता चलता है कि (*f)
समारोह सूचक है आवश्यक है।
एक जवाब के रूप में जोड़ने के लायक नहीं है, लेकिन 'cdecl' एक कमांड लाइन उपकरण है जो आप के लिए यह समझा जाएगा है । – abligh