दिलचस्प पोस्ट
घोषणा / उद्देश्य चर में स्थानों की परिभाषा? जावा में दो सेट की तुलना करने का सबसे तेज़ तरीका क्या है? UIAlertController की बर्खास्तगी को रोकें 10 सेकंड के लिए पॉप-अप विलंब करें, केवल एक बार पॉप अप करें क्या जावास्क्रिप्ट में वैकल्पिक फ़ंक्शन पैरामीटर करने का एक बेहतर तरीका है? स्थानीय सर्वर पर छवि लेखन मुखौटा डिजाइन पैटर्न क्या है? व्हाट्सएप या फेसबुक के माध्यम से छवि और पाठ साझा करें सी / सी ++ में अंतहीन लूप मोंगोडब नेस्टेड सरणी के भीतर वृद्धि मूल्य DataContract / DataMember विशेषताओं को अनदेखा करने के लिए JSON.NET कॉन्फ़िगर करें Pdftotext -layout जैसे पीठ की तरह रीडिंग पीठ? एक PHP फ़ंक्शन के लिए तर्कों की चर संख्या कैसे पारित करें git अपवाद की अनदेखी करें JQuery के साथ भागने की कुंजी के लिए कौन सी कुंजीकोड

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 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);