What is Function Pointer in C++ Language
Function Pointer in C++ - सी ++ में फंक्शन पॉइंटर
What is Function Pointer in C++ Language
जैसा कि हम जानते हैं कि पॉइंटर्स का उपयोग कुछ वेरिएबल्स को इंगित करने के लिए किया जाता है; इसी तरह, फ़ंक्शन पॉइंटर एक पॉइंटर होता है जिसका उपयोग फ़ंक्शंस को इंगित करने के लिए किया जाता है। यह मूल रूप से किसी फ़ंक्शन के पते को संग्रहीत करने के लिए उपयोग किया जाता है। हम फ़ंक्शन पॉइंटर का उपयोग करके फ़ंक्शन को कॉल कर सकते हैं, या हम पैरामीटर के रूप में पॉइंटर को दूसरे फ़ंक्शन में भी पास कर सकते हैं।
वे मुख्य रूप से ईवेंट-संचालित एप्लिकेशन, कॉलबैक और यहां तक कि सरणियों में फ़ंक्शन को संग्रहीत करने के लिए उपयोगी होते हैं।
What is the address of a function? - समारोह का पता क्या है ?
कंप्यूटर केवल लो-लेवल लैंग्वेज यानी बाइनरी फॉर्म को ही समझता है। C++ में हम जो प्रोग्राम लिखते हैं वह हमेशा हाई लेवल लैंग्वेज में होता है इसलिए प्रोग्राम को बाइनरी फॉर्म में बदलने के लिए हम कंपाइलर का इस्तेमाल करते हैं। कंपाइलर एक प्रोग्राम है जो सोर्स कोड को एक निष्पादन योग्य फ़ाइल में परिवर्तित करता है। यह निष्पादन योग्य फ़ाइल RAM में संग्रहीत हो जाती है। सीपीयू मुख्य () विधि से निष्पादन शुरू करता है, और यह कॉपी को रैम में पढ़ता है लेकिन मूल फ़ाइल को नहीं।
सभी कार्य और मशीन कोड निर्देश डेटा हैं। यह डेटा बाइट्स का एक गुच्छा है, और इन सभी बाइट्स का RAM में कुछ पता है। फ़ंक्शन पॉइंटर में फ़ंक्शन के पहले निर्देश का RAM पता होता है।
Syntax for Declaration - घोषणा के लिए सिंटेक्स
फ़ंक्शन पॉइंटर की घोषणा के लिए निम्नलिखित सिंटैक्स है:
int (*FuncPtr) (int,int);
उपरोक्त सिंटैक्स फ़ंक्शन घोषणा है। चूंकि फ़ंक्शन वेरिएबल्स के रूप में सरल नहीं हैं, लेकिन सी ++ एक प्रकार सुरक्षित है, इसलिए फ़ंक्शन पॉइंटर्स में वापसी प्रकार और पैरामीटर सूची होती है। उपरोक्त सिंटैक्स में, हम पहले रिटर्न प्रकार की आपूर्ति करते हैं, और फिर पॉइंटर का नाम, यानी, FuncPtr जो ब्रैकेट से घिरा हुआ है और सूचक प्रतीक से पहले है, यानी, (*)। इसके बाद, हमने पैरामीटर सूची (इंट, इंट) प्रदान की है। उपरोक्त फ़ंक्शन पॉइंटर किसी भी फ़ंक्शन को इंगित कर सकता है जो दो पूर्णांक पैरामीटर लेता है और पूर्णांक प्रकार मान देता है।
Address of a function- समारोह का पता
हम किसी Function का पता बहुत आसानी से प्राप्त कर सकते हैं। हमें केवल फ़ंक्शन के नाम का उल्लेख करने की आवश्यकता है, हमें फ़ंक्शन को कॉल करने की आवश्यकता नहीं है।
आइए एक उदाहरण के माध्यम से समझाते हैं।
#include <iostream>
using namespace std;
int main()
{
std::cout << "Address of a main() function is : " <<&main<< std::endl;
return 0;
}
उपरोक्त प्रोग्राम में, हम एक main() function का पता प्रदर्शित कर रहे हैं। मुख्य () फ़ंक्शन के पते को प्रिंट करने के लिए, हमने केवल फ़ंक्शन के नाम का उल्लेख किया है, कोई कोष्ठक नहीं है, न कि पैरामीटर। इसलिए, बिना किसी कोष्ठक या पैरामीटर के फ़ंक्शन के नाम का अर्थ किसी फ़ंक्शन का पता है।
हम किसी फ़ंक्शन के पते को प्रिंट करने के वैकल्पिक तरीके का उपयोग कर सकते हैं, अर्थात, और मुख्य।
Calling a function indirectly - फ़ंक्शन को अप्रत्यक्ष रूप से कॉल करना
हम फ़ंक्शन पॉइंटर के नाम का उपयोग करके फ़ंक्शन पॉइंटर की सहायता से फ़ंक्शन को कॉल कर सकते हैं। फ़ंक्शन पॉइंटर के माध्यम से फ़ंक्शन को कॉल करने का सिंटैक्स वैसा ही होगा जैसा हम सामान्य रूप से फ़ंक्शन को कॉल करते हैं।
आइए इस परिदृश्य को एक उदाहरण के माध्यम से समझते हैं।
#include <iostream>
using namespace std;
int add(int a , int b)
{
return a+b;
}
int main()
{
int (*funcptr)(int,int); // function pointer declaration
funcptr=add; // funcptr is pointing to the add function
int sum=funcptr(5,5);
std::cout << "value of sum is :" <<sum<< std::endl;
return 0;
}
उपरोक्त प्रोग्राम में, हम फंक्शन पॉइंटर की घोषणा करते हैं, यानी, int (*funcptr)(int,int) और फिर हम funcptr में ऐड () फंक्शन का एड्रेस स्टोर करते हैं। इसका तात्पर्य है कि funcptr में ऐड () फ़ंक्शन का पता है। अब, हम funcptr का उपयोग करके ऐड () फ़ंक्शन को कॉल कर सकते हैं। स्टेटमेंट funcptr (5,5) ऐड () फ़ंक्शन को कॉल करता है, और ऐड () फ़ंक्शन का परिणाम राशि चर में संग्रहीत हो जाता है।
Output:-
आइए फंक्शन पॉइंटर का एक और उदाहरण देखें।
#include <iostream>
using namespace std;
void printname(char *name)
{
std::cout << "Name is :" <<name<< std::endl;
}
int main()
{
char s[20]; // array declaration
void (*ptr)(char*); // function pointer declaration
ptr=printname; // storing the address of printname in ptr.
std::cout << "Enter the name of the person: " << std::endl;
cin>>s;
cout<<s;
ptr(s); // calling printname() function
return 0;
}
उपरोक्त कार्यक्रम में, हम फ़ंक्शन प्रिंटनेम () को परिभाषित करते हैं जिसमें एक पैरामीटर के रूप में चार पॉइंटर होते हैं। हम फंक्शन पॉइंटर घोषित करते हैं, अर्थात, शून्य (*ptr)(char*)। कथन ptr=printname का अर्थ है कि हम ptr को printname() फ़ंक्शन का पता निर्दिष्ट कर रहे हैं। अब, हम स्टेटमेंट ptr(s) का उपयोग करके प्रिंटनेम () फ़ंक्शन को कॉल कर सकते हैं।
Output:-
Passing a function pointer as a parameter - पैरामीटर के रूप में फ़ंक्शन पॉइंटर पास करना
फ़ंक्शन पॉइंटर को दूसरे फ़ंक्शन के पैरामीटर के रूप में पारित किया जा सकता है।
आइए एक उदाहरण के जरिए समझते हैं।
#include <iostream>
using namespace std;
void func1()
{
cout<<"func1 is called";
}
void func2(void (*funcptr)())
{
funcptr();
}
int main()
{
func2(func1);
return 0;
}
उपरोक्त कोड में, func2() फ़ंक्शन फ़ंक्शन पॉइंटर को पैरामीटर के रूप में लेता है। मुख्य () विधि func2 () फ़ंक्शन को कॉल करती है जिसमें func1 () का पता पारित किया जाता है। इस तरह, func2() फ़ंक्शन func1() को अप्रत्यक्ष रूप से कॉल कर रहा है।