एक फ़ंक्शन पॉइंटर में फ़ंक्शन का पता होता है - जो भी किसी दिए गए सिस्टम के लिए है। आप अप्रत्यक्ष रूप से फ़ंक्शन को कॉल करने के लिए इसका उपयोग कर सकते हैं, आप फ़ंक्शन पॉइंटर मान असाइन और तुलना कर सकते हैं। आप फ़ंक्शन पॉइंटर को किसी अन्य पॉइंटर-टू-फ़ंक्शन प्रकार में भी परिवर्तित कर सकते हैं, और बहुत आगे।
फ़ंक्शन पॉइंटर को कार्यान्वित करने के लिए एक कंपाइलर के लिए सबसे सरल तरीका फ़ंक्शन का स्मृति पता है, और अधिकांश कंपाइलर इसे इस तरह से करते हैं, लेकिन भाषा मानक इसे निर्दिष्ट नहीं करता है। कुछ सिस्टम (मुझे लगता है कि आईबीएम का एएस/400 एक उदाहरण है) फंक्शन पॉइंटर्स में अतिरिक्त जानकारी स्टोर करें। एक कंपाइलर फिक्स्ड पॉइंटर्स को डिस्क्रिप्टर की एक तालिका में पूर्णांक इंडेक्स के रूप में कार्यान्वित कर सकता है, जब तक आवश्यक अर्थशास्त्र लागू हो।
फ़ंक्शन पॉइंटर को हटाना संभव नहीं है। फ़ंक्शन कॉल के लिए एक पॉइंटर की आवश्यकता होती है, फ़ंक्शन नाम नहीं, इसकी उपसर्ग अभिव्यक्ति के रूप में; यदि आप फ़ंक्शन नाम का उपयोग करते हैं, तो वह नाम पूरी तरह से एक सूचक में परिवर्तित हो जाता है (जहां तक भाषा का संबंध है; जेनरेट किया गया मशीन कोड अलग हो सकता है)। इसलिए किसी प्रोग्राम के लिए यह पता लगाने के लिए कोई पोर्टेबल तरीका नहीं है कि फ़ंक्शन पॉइंटर्स में वास्तव में मेमोरी पते हैं या नहीं।
गैर portably, एक समारोह func
दिया, आप की तरह कुछ कर सकते हैं:
printf("Address of func is %p\n", (void*)func);
और आप शायद कुछ है कि एक स्मृति पते की एक मानव पठनीय प्रतिनिधित्व दिखाई देगा।लेकिन कड़ाई से बोलते हुए, फ़ंक्शन पॉइंटर के रूपांतरण का व्यवहार void*
को भाषा द्वारा परिभाषित नहीं किया गया है, और यह कुछ सिस्टम पर काम नहीं कर सकता है।
आप पराक्रम भी unsigned char*
करने के लिए एक समारोह सूचक बदलने और समारोह की मशीन कोड की जांच करने में सक्षम हो, लेकिन कहीं सी मानक द्वारा परिभाषित कुछ भी परे चला जाता है।
फ़ंक्शन पॉइंटर्स को अपारदर्शी मानों के रूप में पेश करना सबसे अच्छा है जो कुछ अनिर्दिष्ट तरीके से विशेष कार्यों को संदर्भित करते हैं।
स्रोत
2014-03-07 16:24:59
क्या आप अपने फ़ंक्शन पॉइंटर्स या अन्य पॉइंटर्स पर अवैध मेमोरी एक्सेस देख रहे हैं? –
अवैध स्मृति पहुंच के कारण "हमें पॉइंटर्स में कई त्रुटियों का सामना करना पड़ता है" का क्या अर्थ है? ये त्रुटियां कैसे होती हैं? ये त्रुटियां क्या हैं? –
@ स्टेव नहीं @ एसएलओटी मैं उन त्रुटियों का जिक्र कर रहा था जब हम कुछ कचरे के लिए int * प्रारंभ करते हैं जो सुरक्षित स्मृति पता है। –