संकेत के मामले और लाभ क्या हैं? [बन्द है]


10

मैं अक्सर पॉइंटर्स के फायदे (निम्न स्तर की प्रोग्रामिंग को छोड़कर) देखने के लिए संघर्ष करता हूं।

क्यों एक स्ट्रिंग या चार [] के बजाय चार * का उपयोग करें या क्या सूचक अंकगणित लाता है।

तो क्या हैं और संकेत के मामलों का उपयोग करें?


6
यह थोड़ा संभ्रांत लग रहा है, लेकिन IMHO अगर आपको पेशेवरों और विपक्षियों के विपक्ष के बारे में पूछना है, तो आपको सबसे अधिक आवश्यकता है।
जस

3
शायद! लेकिन सवाल अभी भी वैध है!
ज़ोलोमन नोव

1
यह भी वास्तव में भाषा-अज्ञेय नहीं है, क्योंकि सभी प्रोग्रामिंग भाषाओं में सी अर्थ में वास्तविक संकेत नहीं हैं।
डेविड थॉर्नले

जवाबों:


6

डायनेमिक मेमोरी लोकेशन, कई डेटा स्ट्रक्चर्स और बड़ी मात्रा में डेटा की कुशल हैंडलिंग के लिए पॉइंटर्स आवश्यक हैं। पॉइंटर्स के बिना, आपको विश्व स्तर पर या फ़ंक्शंस या समकक्ष में सभी प्रोग्राम डेटा आवंटित करना होगा, और यदि आपके पास मूल रूप से अनुमति दी गई थी, तो डेटा की मात्रा में वृद्धि होने पर आपको कोई सहारा नहीं होगा। मैं यहां निरपेक्षता का उपयोग करने में संकोच करता हूं, लेकिन जहां तक ​​मुझे पता है कि सभी आधुनिक कंप्यूटर भाषाओं में किसी न किसी रूप में संकेत होते हैं।

अधिकांश भाषाओं में जो पॉइंटर्स का उपयोग करते हैं, कुछ निश्चित प्रकार के संदर्भ हैं जो पॉइंटर्स हैं, और शायद कुछ विशेष प्रकार के संदर्भ हैं, और आगे कोई उल्लेखनीय अंतर नहीं है। लिस्प consसेल पॉइंटर्स की एक जोड़ी है, हालाँकि fixnumयह पॉइंटर नहीं है। जावा में, वर्ग के उदाहरण के लिए उपयोग किया जाने वाला चर एक सूचक है, लेकिन intयह नहीं है। भाषा सिंटैक्स यह प्रतिबिंबित नहीं करता है।

सी असामान्य है कि संकेत वैकल्पिक, स्पष्ट हैं, और स्पष्ट सूचक अंकगणित की अनुमति देते हैं। यह लिखना पूरी तरह से संभव है struct foo bar; struct foo * baz;, और एक बार आपके द्वारा मेमोरी आवंटित करने के बाद आप bazदोनों का उपयोग कर सकते हैं barऔर एस bazका प्रतिनिधित्व कर सकते हैं struct foo। चूँकि संकेत वैकल्पिक होते हैं, अत: इसमें भिन्नताएँ होना उपयोगी होता है। (यह स्मार्ट पॉइंटर्स के लिए C ++ में आवश्यक है, जैसा कि दिया गया है boost::shared_ptr<foo> bar;, bar.reset()इसका एक अर्थ है और bar->reset()बहुत अलग होने की संभावना है।)

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

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

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


बहुत अच्छा जवाब
केट ग्रेगोरी

1
मैं इस उत्तर को स्वीकार करता हूं क्योंकि यह सर्वश्रेष्ठ अंतर का वर्णन करता है जिसे मैं C / C ++ और जावा में संदर्भों के बीच समझा नहीं सकता था।
ओलिवर

यह संक्षेप में जोड़ना अच्छा होगा कि जावा गोस्लिंग (जावा के प्रमुख निर्माता) द्वारा कथित "कोन" को बेहतर ढंग से स्पष्ट करने के लिए जावा का उपयोग क्यों नहीं करता है।
गुइडो एंसेलमी जूल

10

जटिल डेटा संरचनाएं। आप एक लिंक की गई सूची या बिंदुओं के बिना एक द्विआधारी पेड़ की तरह कुछ नहीं बना सकते हैं।

वहाँ कोई "पेशेवरों" और संकेत के "विपक्ष" हैं। वे सिर्फ एक उपकरण हैं, हथौड़े की तरह।


5
जावा में, कोई संकेत नहीं है। फिर भी, लिंक्ड सूची और बाइनरी ट्री का निर्माण करना संभव है। संदर्भ (जावा में) और संकेत के बीच अंतर है (सी के रूप में)।
StartClass0830

7
संदर्भ और संकेत में कोई अंतर नहीं है। सूचक अंकगणित सी-विशिष्ट है; अन्य भाषाएं हैं जिनमें संकेत हैं, लेकिन सूचक अंकगणित (जैसे, पास्कल) नहीं है।
zvrba

1
बिंदु और संदर्भ आपके विचार के समानार्थी नहीं हैं। मतभेदों को देखने के लिए इसे पढ़ें। stackoverflow.com/questions/57483/…
StartClass0830

4
उस सूची के पहले दो आइटमों को संबोधित करने के लिए: जावा संदर्भों को फिर से असाइन किया जा सकता है और वे शून्य करने के लिए इंगित कर सकते हैं। एक सूचक की विशिष्ट विशेषता यह है कि आप अप्रत्यक्ष रूप से किसी अन्य ऑब्जेक्ट को संदर्भित करने की अनुमति देता है। मेरा लिटमस टेस्ट है: यदि आप परिपत्र डेटा संरचना (जिसे आप जावा संदर्भ के साथ प्राप्त कर सकते हैं) का निर्माण कर सकते हैं, तो यह एक सूचक है। (ध्यान दें कि आप C ++ संदर्भ के साथ परिपत्र डेटा संरचना नहीं बना सकते हैं।)
zvrba

1
संकेत और संदर्भ के बीच अंतर है। उदाहरण के लिए, C # में दोनों हैं । ( blogs.msdn.com/b/ericlippert/archive/2009/02/17/… )
स्टीवन एवर्स

2
  • संकेत के साथ आप रनटाइम में मेमोरी को आवंटित और निपटा सकते हैं।
  • और आप बड़े डेटा-स्ट्रक्चर्स का उपयोग कर सकते हैं, इसे कॉपी किए बिना स्कोप की अनुमति है।

C ++, Java और अन्य प्रकार की भाषाओं में सन्दर्भ केवल 'सुरक्षित बिंदु' हैं। और ये संदर्भ जावा में बहुत उपयोग किए जाते हैं।


1
C ++ में सन्दर्भ सुरक्षित संकेत नहीं हैं। C ++ में सन्दर्भों का संकेत देने वालों से कोई लेना-देना नहीं है। C ++ में संदर्भ उपनाम हैं । उन्हें सौंपा नहीं जा सकता NULL, और उनके बनाए जाने के बाद उन्हें संशोधित नहीं किया जा सकता है।
बिली ओनली

@ बिली: सी ++ संदर्भ आमतौर पर पॉइंटर्स का उपयोग करके कार्यान्वित किए जाते हैं, और कुछ चीजों में समान रूप से काम करते हैं, इसलिए लोग उन्हें कुछ प्रकार के विवश सूचक के रूप में सोचते रहते हैं।
डेविड थॉर्नले 13

2

बहुत अधिक किसी भी कंप्यूटर प्रोग्राम को स्मृति में मूल्यों का निरीक्षण करने और बदलने की जरूरत है (जिन्हें पीकिंग और पोकिंग के रूप में जाना जाता है, हममें से जो बहुत पुराने हैं)। आपको यह नियंत्रित करने की आवश्यकता है कि स्मृति में वे मान कहां हैं, ताकि परिणाम पूर्वानुमेय हो (और कुछ मामलों में, आदेश महत्वपूर्ण है: निष्पादन योग्य कोड लोड करना एक उदाहरण है)। इसलिए आपके पास एक डेटा प्रकार होना चाहिए जो मेमोरी में किसी स्थान का प्रतिनिधित्व करता है। यहां तक ​​कि अगर आपके प्रोग्रामिंग वातावरण छुपा है कि एक अमूर्त के तहत, यह अभी भी वहाँ है।


2

char*संकेत का एक गंभीर उदाहरण है। आप शायद std::string(या कुछ बेहतर प्रकार का उपयोग करके बेहतर हैं जो आपकी यूनिकोड / एएनएसआई / मल्टीबाइट विशेषता) को संभालता है char*। संकेत के लगभग किसी भी अन्य उदाहरण के लिए ( Employee*, PurchaseOrder*, ...), तथापि, वहाँ कई लाभ हैं:

  • किसी एकल फ़ंक्शन से बड़ा स्कोप - ढेर पर ऑब्जेक्ट को आवंटित करें और पॉइंटर को लंबे समय तक पास करें
  • त्वरित कार्य बड़ी वस्तुओं के लिए कहता है क्योंकि आपके पास पास-दर-मूल्य की प्रतिलिपि लागत नहीं है
  • एक तरीका यह करने के लिए पारित करने के लिए एक समारोह को सक्षम करने के लिए
  • संपूर्ण ऑब्जेक्ट के बजाय केवल पते की प्रतिलिपि बनाकर संग्रह में स्थान और समय बचाएं

वास्तव में, पॉइंटर्स इतने महत्वपूर्ण हैं कि अधिकांश भाषाएं जो वास्तव में उनके पास नहीं हैं, वे वास्तव में उनके पास हैं। C # और Java में संदर्भ प्रकार अनिवार्य रूप से ठोस वस्तुओं के रूप में प्रच्छन्न बिंदु हैं।

अब, पॉइंटर मैनिपुलेशन ( p++एक पॉइंटर पर, या p += delta) एक पूरी 'नोटेर कहानी है। कुछ लोग सोचते हैं कि यह खतरनाक है, कुछ लोग सोचते हैं कि यह बहुत अच्छा है। लेकिन यह आपके प्रश्न से और भी अधिक है।


1

पॉइंटर्स तेज़ हो सकते हैं और डेटा संरचनाओं और प्रोग्राम निष्पादन पदचिह्न को नीचे रखने में, कम ओवरहेड को उकसा सकते हैं। (कृपया 'कैन' शब्द पर ध्यान दें।)

सामान्य तौर पर, नियम है, यदि आपने एक संसाधन आवंटित किया है, या तो अपना स्वयं का आवंटन करके या अपनी ओर से कुछ कर रहे हैं, तो यह आपका काम है कि इसे कब जारी किया जाए।

उपर्युक्त करने का भार ज़िम्मेदारी को डेवलपर पर वापस रख रहा है, बजाय रनटाइम के ऐसा करने के बजाय। इसके कुछ और फायदे हैं कि चीजों को लंबे समय तक जीवित रखा जा सकता है, या सीमाओं को पार किया जा सकता है, या अधिक उपयुक्त समय पर निपटाया जा सकता है, या चारों ओर एक कचरा कलेक्टर के वजन को ले जाने की आवश्यकता नहीं है।

विदेशी मामलों में, आमतौर पर अपवादों और दायरे को शामिल करते हुए, कुछ किनारे मामले होते हैं जिनके लिए कोड की सफाई से बचने के लिए किसी को थोड़ा अधिक सावधान रहने की आवश्यकता होती है। वास्तविक रूप से, इन मामलों को चारों ओर डिजाइन किया जा सकता है। हम कई दशकों तक प्रबंधित कोड के बिना रहते थे।

अक्सर क्या संकेत देता है "कठिन" केवल समझ में नहीं आ रहा है कि हार्डवेयर स्तर पर क्या हो रहा है। यह अप्रत्यक्ष से ज्यादा कुछ नहीं है।

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

कोन साइड आमतौर पर किसी चीज़ को रिलीज़ करने के लिए, या इसे एक से अधिक बार रिलीज़ करके, या इसके रिलीज़ होने के बाद किसी चीज़ को रिफ़र करने से, या जब आप कहीं भी इशारा नहीं कर रहे होते हैं, तो इसे रिफ़ायर करके बर्बाद कर देते हैं। ये चीजें अक्सर शानदार दुर्घटनाओं का कारण बनती हैं, और ईमानदार होना आमतौर पर संकेत देता है कि आपको तर्क समस्या मिल गई है, बजाय संकेत नाजुक हैं।

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

सभी ने कहा, जब तक आपको पॉइंटर्स की आवश्यकता नहीं होती, तब तक जो अच्छा कचरा संग्रह प्रदान करता है, वह शालीनता और एक्सोइटिक मामले एक प्रबंधित वातावरण में काम करता है जो बहुत अच्छा है। कुछ मेमोरी को हथियाने, उसका उपयोग करने और इसे छोड़ने के लिए सक्षम होने के लिए बहुत अच्छा है, यह जानते हुए कि कुछ समय बाद, यह डिसेर्बर्ड हो सकता है, अगर यह ऐसा करने के लिए समझ में आता है। कोडर के हिस्से पर यह थोड़ा कम कोड है, बदले में कुछ अतिरिक्त उठाने के लिए।


0

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


-1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.