2010-12-13 22 views
23

पॉइंटर तर्क पास कर रहा है, सी ++ में मूल्य से गुजरता है? चूंकि मैं देखता हूं कि पॉइंटर में कोई भी परिवर्तन विधि के बाहर दिखाई नहीं देता है। सूचकांक को dereferencing द्वारा किए गए परिवर्तन हालांकि परिलक्षित होता है।पॉइंटर तर्क पास कर रहा है, सी ++ में मूल्य से गुजरता है?

उस स्थिति में, सूचक के रूप में पॉइंटर को संशोधित करने के लिए पॉइंटर को पॉइंटर का उपयोग करने के लिए स्वीकार्य/मानक प्रक्रिया है, जैसे कि फ़ंक्शन के भीतर सूचक मूल्य को संशोधित करने के लिए?

+5

पॉइंटर मूल्य से पारित किया जाता है लेकिन पॉइंटर द्वारा इंगित ऑब्जेक्ट को फ़ंक्शन (कॉन्स्ट-क्वालिफिकेशन के आधार पर) द्वारा संशोधित किया जा सकता है। – dreamlax

उत्तर

24

दोनों के लिए हाँ।

पॉइंटर्स मूल्य के अनुसार किसी अन्य चीज़ के रूप में पारित किए जाते हैं। इसका अर्थ है पॉइंटर चर (ऑब्जेक्ट का पता इंगित) की सामग्री की प्रतिलिपि बनाई गई है। इसका अर्थ यह है कि यदि आप फ़ंक्शन बॉडी में पॉइंटर का मान बदलते हैं, तो वह परिवर्तन बाह्य सूचक में दिखाई नहीं देगा जो अभी भी पुरानी वस्तु को इंगित करेगा। लेकिन आप ऑब्जेक्ट के मान को इंगित कर सकते हैं।

यदि आप बाहरी सूचक में पॉइंटर में किए गए परिवर्तनों को प्रतिबिंबित करना चाहते हैं (इसे किसी अन्य चीज़ पर इंगित करें), तो आपको संकेत के दो स्तर (पॉइंटर पॉइंटर) की आवश्यकता है। पॉइंटर के नाम से पहले & डालने के द्वारा इसे कॉल करने पर किया जाता है। यह चीजों को करने का मानक सी तरीका है।

सी ++ का उपयोग करते समय संदर्भों का उपयोग पॉइंटर को पसंद किया जाता है (इसलिए पॉइंटर से पॉइंटर तक भी)।

क्यों संदर्भ के लिए संकेत करने के लिए प्राथमिकता दी जानी चाहिए, इसके कई कारण है:

  • संदर्भ समारोह शरीर में संकेत की तुलना में कम syntaxic शोर परिचय
  • संदर्भ, संकेत की तुलना में अधिक जानकारियां रखने की तुलना में किया जा सकता है संकलक के लिए उपयोगी

संदर्भ की कमियां ज्यादातर हैं:

  • वे सी के सरल पास-बाय-वैल्यू नियम को तोड़ते हैं, जो पैरामीटर के संबंध में किसी फ़ंक्शन के व्यवहार को समझता है (क्या उन्हें बदला जाएगा?) कम स्पष्ट है। सुनिश्चित करने के लिए आपको फ़ंक्शन प्रोटोटाइप की भी आवश्यकता है। लेकिन सी
  • का उपयोग करते समय आवश्यक एकाधिक सूचक स्तरों की तुलना में यह वास्तव में खराब नहीं है, वे सी द्वारा समर्थित नहीं हैं, यह एक समस्या हो सकती है जब आप कोड लिखते हैं जो सी और सी ++ प्रोग्राम दोनों के साथ काम करना चाहिए (लेकिन यह सबसे अधिक नहीं है सामान्य मामला)।

सूचक को सूचक के विशिष्ट मामले में, अंतर ज्यादातर सादगी है, लेकिन यह संदर्भ का उपयोग करते हुए भी संकेत दिए गए दोनों स्तरों को हटाने और सूचक के लिए सूचक के बजाय केवल एक संदर्भ पारित करने के लिए आसान हो सकता है।

+1

संदर्भों के लिए पॉइंटर्स का उपयोग करना क्यों पसंद किया जाता है? – Arafangion

+0

@Arafangion: मैंने यह बताने के लिए अपना जवाब संपादित किया कि पॉइंटर्स को वरीयताओं को क्यों प्राथमिकता दी जानी चाहिए। – kriss

+0

मुझे लगता है कि यह व्यक्तिपरक है - मैं संदर्भों का उपयोग करना पसंद करता हूं क्योंकि मैं कॉलर को शून्य सूचक की जांच की ज़िम्मेदारी लेता हूं, और मुझे आमतौर पर सी संगतता की परवाह नहीं है। हालांकि मुझे यकीन नहीं है कि मुझे बेचा गया है कि "आपको यह सुनिश्चित करने के लिए फ़ंक्शन प्रोटोटाइप की भी आवश्यकता है कि मान परिवर्तित नहीं हुआ है" - यह सी ++ के कई वर्गों के लिए सच है - वे पॉइंटर्स स्वयं हो सकते हैं और शायद डेटा साझा नहीं कर सकते हैं या नहीं। उस ने कहा, मैं मूल्य से गुजरना पसंद करता हूं और कक्षा को किसी भी पॉइंटर्स की देखभाल करने की अनुमति देता हूं, यदि तक कि किसी की आवश्यकता न हो, जब तक कि मैं रैल्यू संदर्भों को वापस नहीं कर रहा हूं जिन्हें तत्काल सेट किया जाना चाहिए, भले ही +1 – Arafangion

0

या तो पॉइंटर के लिए एक सूचक, या सूचक के संदर्भ में, यदि आप संभावित रूप से सूचक को बदलना चाहते हैं तो आप इसका उपयोग करेंगे। आपके मूल प्रश्न के लिए, तकनीकी रूप से, हाँ, सभी पैरामीटर मान द्वारा पारित किए जाते हैं।

+7

"सभी पैरामीटर मान द्वारा पारित किए जाते हैं" नहीं, संदर्भ द्वारा पारित तर्क मूल्य से पारित नहीं होते हैं। –

0

हाँ, यह है, के रूप में यह सी

में है कि मामले में, यह एक समारोह के भीतर एक समारोह के लिए तर्क के रूप में सूचक, सूचक का उपयोग करने जैसे सूचक मूल्य को संशोधित करने के स्वीकार्य/मानक प्रक्रिया है ?

किस मामले में? तुम क्या चाहते हो?आप & संशोधक के साथ वास्तविक संदर्भों का उपयोग कर सकते हैं।

void func(type &ref); 
6

मैं यहां भ्रम को समझता हूं। "मूल्य से गुजरने" और "संदर्भ द्वारा पास" की अवधारणाएं इतनी स्पष्ट नहीं हैं कि वे ऐसा प्रतीत होते हैं। ध्यान रखें कि कंप्यूटर इन अवधारणाओं को नहीं जानता है और इसके अनुसार व्यवहार नहीं करता है। कंप्यूटर को प्रकारों के बारे में पता नहीं है। इसलिए यह पॉइंटर्स और मूल्यों का भेद नहीं करता है। मेरे द्वारा और उदाहरण समझाने की कोशिश करते हैं:

void func1(int x) 
{ 
    x = 5; 
} 

void func2(int *x) 
{ 
    int a; 
    x = &a; 
} 

आपरेशन दोनों कार्यों में मशीन के लिए एक ही है: यह तर्क हो जाता है और यह बदल जाता है। ध्यान दें कि, दूसरे फ़ंक्शन में यह modifiy * x नहीं है, यह x संशोधित करता है।

अब अगर हम इन कार्यों फोन,

int y = 10; 

func1(y); //value of y does not change 

func2(&y); //value of &y does not change, but the value of the address which y points may change. 

मुझे लगता है कि, मूल रूप से, हर कार्य कॉल "मूल्य से कॉल" है कहने के लिए पसंद करते हैं। लेकिन एक सूचक प्रकार के मामले में, हमारे पास स्मृति में किसी अन्य पते की सामग्री को बदलने का एक तरीका है।

अगर हम

void func2(int *x) 
{ 
    *x = 5; 
} 

रूप func2 लिखा था फिर, इस "संदर्भ द्वारा कॉल" के एक असली मामला होगा।

संबंधित मुद्दे