आपके सभी उदाहरण अपरिभाषित रन-टाइम व्यवहार उत्पन्न करते हैं। निष्पादन समारोह को छोड़ने के बाद गायब होने वाले आइटमों के लिए आप पॉइंटर्स या संदर्भ लौट रहे हैं।
मुझे स्पष्ट करते हैं:
int * returnA()
{
static int a; // The static keyword keeps the variable from disappearing.
int * j = 0; // Declare a pointer to an int and initialize to location 0.
j = &a; // j now points to a.
return j; // return the location of the static variable (evil).
}
अपने कार्य में, चर j
a
के अस्थायी स्थान को इंगित करने के लिए आवंटित किया गया है। आपके फ़ंक्शन के बाहर निकलने पर परिवर्तनीय a
गायब हो जाता है, लेकिन यह पूर्व स्थान j
के माध्यम से वापस किया जाता है। चूंकि a
j
की ओर इशारा करते हुए स्थान पर मौजूद नहीं है, इसलिए *j
तक पहुंचने के साथ अपरिभाषित व्यवहार होगा।
कार्यों के अंदर चर को अन्य कोड द्वारा संदर्भ या सूचक के माध्यम से संशोधित नहीं किया जाना चाहिए। ऐसा हो सकता है हालांकि यह अपरिभाषित व्यवहार पैदा करता है।
पेडेंटिक होने के कारण, पॉइंटर्स लौटाए जाने वाले पॉइंटर्स निरंतर डेटा को इंगित करने के रूप में घोषित किए जाने चाहिए। लौटा संदर्भ संदर्भ होना चाहिए:
const char * Hello()
{
static const char text[] = "Hello";
return text;
}
उपरोक्त फ़ंक्शन निरंतर डेटा के लिए एक सूचक देता है। अन्य कोड स्थैतिक डेटा तक पहुंच (पढ़ सकते हैं) लेकिन संशोधित नहीं किया जा सकता है।
const unsigned int& Counter()
{
static unsigned int value = 0;
value = value + 1;
return value;
}
ऊपर समारोह में, value
पहली प्रविष्टि पर शून्य करने के लिए आरंभ नहीं हो जाता। इस फ़ंक्शन के सभी अगले निष्पादन value
को एक से बढ़ाए जाने का कारण बनते हैं। फ़ंक्शन निरंतर मान का संदर्भ देता है। इसका अर्थ यह है कि अन्य फ़ंक्शन मान (दूर से) का उपयोग कर सकते हैं जैसे कि यह एक चर था (बिना पॉइंटर को डिफरेंस करने के)।
मेरी सोच में, एक वैकल्पिक पैरामीटर या ऑब्जेक्ट के लिए एक पॉइंटर का उपयोग किया जाता है। ऑब्जेक्ट मौजूद होने पर एक संदर्भ पारित किया जाता है। फ़ंक्शन के अंदर, एक संदर्भित पैरामीटर का अर्थ है कि मान मौजूद है, हालांकि इसे संदर्भित करने से पहले एक पॉइंटर को शून्य के लिए चेक किया जाना चाहिए। इसके अलावा, एक संदर्भ के साथ, और अधिक गारंटी है कि लक्ष्य वस्तु मान्य है। एक सूचक एक अमान्य पते (शून्य नहीं) को इंगित कर सकता है और अपरिभाषित व्यवहार का कारण बन सकता है।
स्रोत
2010-05-14 21:04:41
इन सवालों के जवाब पूरी तरह निर्भर ए, बी, और सी की घोषणाओं पर, जो कोड से गायब लगते हैं। –
मान लें कि ए, बी, सी शुरू हो गए हैं। –
चर इंक हैं। –