दिलचस्प पोस्ट
कैसे एक जीआईटी रिपॉजिटरी को एक दूसरे पर रिबेस करने के लिए? एंड्रॉइड, कैसे sqlitedatabase में एक एसक्यूएल फ़ाइल exec करने के लिए रीड ऑर राइट प्रोटेक्टड मेमोरी के लिए प्रयास किया गया। यह अक्सर संकेत है कि अन्य स्मृति भ्रष्ट है निर्धारित हैडर के लिए समायोजित करने के लिए एक HTML एंकर को ऑफसेट करना Sed के साथ पीछे के स्थान को कैसे निकालना है? कुछ फ़ंक्शंस को फ़ंक्शन नाम से पहले और बाद में "__" को क्यों रेखांकित किया जाता है? एक आवेदन को छोड़कर पर frowned है? MVC3 DropDownListFor – एक सरल उदाहरण? मैक ओएस एक्स में कुंजी प्रेस की घटनाओं का अनुकरण क्या argv लिखने योग्य है? क्या यह कॉन्फ़िग फाइलों में परिवेश चर (सादा पाठ के बजाय) के रूप में पासवर्ड संग्रहीत करने के लिए सुरक्षित है? फायरबसे चैट पुश नोटिफिकेशन सरणीबफ़र से पीडीएफ प्रदर्शित करना तोड़ जब एक मान दृश्य स्टूडियो डीबगर का उपयोग कर बदलता है पैराग्राफ में कीवर्ड हाइलाइट करें

क्या पॉइंटर तर्क गुजर रहा है, सी ++ में मान से गुजरता है?

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

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

Solutions Collecting From Web of "क्या पॉइंटर तर्क गुजर रहा है, सी ++ में मान से गुजरता है?"

हां दोनों को हां।

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

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

संदर्भों का उपयोग करते हुए सी ++ का उपयोग करते समय, संकेतक को पसंद किया जाता है (अब भी सूचक को सूचक पर)।

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

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

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

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

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

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

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

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

अब अगर हम इन कार्यों को कहते हैं,

 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. 

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

अगर हमने func2 रूप में लिखा था

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

फिर, यह "संदर्भ द्वारा कॉल" का वास्तविक मामला होगा

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

हाँ यह है, क्योंकि यह सी में है

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

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

 void func(type &ref);