पॉइंटर्स का उपयोग करके प्रोग्रामिंग समस्याओं का सबसे अच्छा हल क्या है? [बन्द है]


58

ठीक है, मैं मूल रूप से समझता हूं कि पॉइंटर्स का उपयोग कैसे किया जाए, लेकिन बेहतर प्रोग्रामिंग करने के लिए उनका उपयोग करना सबसे अच्छा नहीं है।

संकेत के उपयोग को शामिल करने के लिए अच्छी परियोजनाएं या समस्याएं क्या हैं ताकि मैं उन्हें बेहतर समझ सकूं?


पॉइंटर्स का उपयोग करके प्रोग्रामिंग समस्याओं को सबसे अच्छा हल करने के बारे में पूछें, न कि क्या प्रोजेक्ट / प्रोग्राम। आप पॉइंटर्स का उपयोग करके या तो एक प्रोग्राम लिख सकते हैं या नहीं - वे (परियोजनाएं) एक सार्थक उत्तर के लिए बस एक निर्माण हैं।
Oded

37
प्रोग्रामिंग समस्याओं को पॉइंटर्स का उपयोग करके बनाया जाता है, हल नहीं किया जाता है। :)
xpda

4
वास्तव में, मुझे आश्चर्य है कि सूचक के बिना कौन सी समस्याएं हल हो सकती हैं। यकीन के लिए बहुत कम।
deadalnix

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

3
उह, इनमें से कुछ जवाब भयानक हैं।

जवाबों:


68

मेमोरी में बड़ी मात्रा में डेटा को मैनिप्युलेट करना जहां पॉइंटर्स वास्तव में चमकते हैं।

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


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

44

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

  1. सॉर्टिंग
    जब सॉर्ट एल्गोरिथ्म में डेटा ले जाता है, तो आप डेटा के बजाय पॉइंटर को स्थानांतरित कर सकते हैं - 100 चार्ट की एक स्ट्रिंग पर लाखों पंक्तियों को सॉर्ट करने के बारे में सोचें; आप अनावश्यक डेटा आंदोलनों को बहुत सहेजते हैं।

  2. लिंक की गई सूची
    आप अगले और / या पिछले आइटम स्थान को संग्रहीत कर सकते हैं न कि रिकॉर्ड से जुड़े संपूर्ण डेटा को।

  3. पासिंग पैरामीटर
    इस मामले में, आप डेटा के बजाय डेटा का पता ही पास करते हैं। फिर से, एक नाम संपीड़न एल्गोरिथ्म के बारे में सोचें जो लाखों पंक्तियों पर चलता है।

अवधारणा को डेटा संरचनाओं जैसे कि रिलेशनल डेटाबेस में बढ़ाया जा सकता है जहां एक सूचक एक विदेशी कुंजी के समान है । कुछ भाषा संकेत के उपयोग को प्रोत्साहित नहीं करती हैं जैसे C # और COBOL।

उदाहरण कई स्थानों पर पाए जा सकते हैं जैसे:

निम्नलिखित पोस्ट किसी तरह से प्रासंगिक हो सकती है:


14
मैं यह नहीं कहूंगा कि सी # पॉइंटर्स के उपयोग को प्रोत्साहित नहीं करता है; इसके बजाय, यह अप्रबंधित पॉइंटर्स के उपयोग को प्रोत्साहित नहीं करता है - सी # में बहुत सारा सामान है जो मूल्य के बजाय संदर्भ द्वारा पास हो जाता है।
ब्लैकेमॉन

अच्छा एक, अच्छी व्याख्या
सबबी

5
सी # टिप्पणी के लिए नीचा दिखाना पड़ा। सी # "संदर्भ" संकेत करने के लिए समान हैं, यह सिर्फ इतना है कि सी # सार आपको यह जानने से दूर करता है कि वास्तव में आप केवल एक संकेतक के साथ प्रबंधित हीप में ऑब्जेक्ट के साथ काम कर रहे हैं।
मैटवेवी

1
@MattDavey: C # संदर्भ संकेतकर्ता नहीं हैं। आप उनमें से नहीं जोड़ सकते, उन्हें किसी सरणी को अनुक्रमणित करने के लिए उपयोग कर सकते हैं, कई अप्रत्यक्ष उपयोग कर सकते हैं, आदि उदाहरण के लिए, आपके पास संदर्भ नहीं हो सकते।
बिली ओपल

5
@ बिली इस धारणा को स्वीकार करते हैं कि "यह केवल एक संकेतक है यदि आप इस पर अंकगणित कर सकते हैं" स्पष्ट रूप से आकर्षक है, लेकिन मेरे पास आपके साथ बहस करने का धैर्य नहीं है।
मैटवेवी

29

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

लिंक्ड लिस्ट (एकवचन, दोगुना और गोलाकार रूप से जुड़ा हुआ), पेड़ (लाल-काला, एवीएल, ट्राइ, बाइनरी, स्पेस पार्टिशनिंग…), और ग्राफ सभी संरचनाओं के उदाहरण हैं जिन्हें केवल मूल्यों के बजाय संदर्भ के संदर्भ में सबसे स्वाभाविक रूप से निर्मित किया जा सकता है। ।


आप XOR से जुड़ी सूची [=
dan_waterworth

@dan_waterworth: नहीं, मुझे पता है कि काला जादू भी बहुत अच्छा है।
जॉन प्यूडी

8

एक सरल तरीका बहुरूपता में है। बहुरूपता केवल संकेत के साथ काम करता है।

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

for(int i = 0; i < size; i++)
   std::cout << array[i];

के बराबर है

for(int i = 0; i < size; i++)
   std::cout << *(array + i);

यह ज्ञान आपको वास्तव में शांत चीजों को करने की अनुमति देता है जैसे एक पंक्ति में संपूर्ण सरणी की प्रतिलिपि बनाएँ:

while( (*array1++ = *array2++) != '\0')

C ++ में, आप किसी ऑब्जेक्ट के लिए मेमोरी आवंटित करने और पॉइंटर में स्टोर करने के लिए नए का उपयोग करते हैं। आप कभी भी ऐसा करते हैं जब आपको संकलित समय के बजाय रन-टाइम के दौरान ऑब्जेक्ट बनाने की आवश्यकता होती है (यानी कोई विधि एक नई ऑब्जेक्ट बनाता है और इसे एक सूची में संग्रहीत करता है)।

संकेत को बेहतर ढंग से समझने के लिए:

  1. कुछ प्रोजेक्ट खोजें जो पारंपरिक सी-स्ट्रिंग्स और सरणियों के साथ खेलते हैं।
  2. कुछ प्रोजेक्ट खोजें जो विरासत का उपयोग करते हैं।

  3. यहाँ परियोजना है कि मैं अपने दाँत काट रहा हूँ:

एक फ़ाइल से दो nxn मैट्रिसेस में पढ़ें और उन पर बुनियादी वेक्टर अंतरिक्ष संचालन करें और स्क्रीन पर उनका परिणाम प्रिंट करें।

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


2
"बहुरूपता केवल संकेत के साथ काम करता है।" सटीक नहीं: बहुरूपता भी संदर्भों के साथ काम करता है। जो हैं, अंततः, संकेत करते हैं, लेकिन मुझे लगता है कि भेद महत्वपूर्ण है, विशेष रूप से न्यूबीज़ के लिए।
लॉरेंट पीरिन

एक पंक्ति में एक सरणी की प्रतिलिपि बनाने के लिए आपका उदाहरण वास्तव में एक पंक्ति में शून्य-टर्मिनेटेड स्ट्रिंग की नकल करने के लिए है, किसी भी सामान्य सरणी के लिए नहीं।
tcrosley

8

वास्तव में यह समझने के लिए कि पॉइंटर्स क्यों महत्वपूर्ण हैं आपको ढेर आवंटन और स्टैक आवंटन के बीच अंतर को समझने की आवश्यकता है।

निम्नलिखित स्टैक आवंटन का एक उदाहरण है:

struct Foo {
  int bar, baz
};

void foo(void) {
  struct Foo f;
}

स्टैक पर आवंटित वस्तुएं केवल वर्तमान फ़ंक्शन निष्पादन की अवधि के लिए मौजूद हैं। जब कॉल fooस्कोप से बाहर जाता है तो वैरिएबल करता है f

एक मामला जहां यह एक मुद्दा बन जाता है, जब आपको एक फ़ंक्शन से एक अभिन्न प्रकार के अलावा कुछ और वापस करने की आवश्यकता होती है (उदाहरण के लिए ऊपर के उदाहरण से फू संरचना)।

उदाहरण के लिए, निम्न फ़ंक्शन तथाकथित "अपरिभाषित व्यवहार" होगा।

struct Foo {
  int bar, baz
};

struct Foo *foo(void) {
  struct Foo f;
  return &f;
}

यदि आप struct Foo *किसी फ़ंक्शन से कुछ वापस करना चाहते हैं , तो आपको वास्तव में एक ढेर आवंटन की आवश्यकता है:

struct Foo {
  int bar, baz
};

struct Foo *foo(void) {
  return malloc(sizeof(struct Foo));
}

फ़ंक्शन mallocहीप पर ऑब्जेक्ट आवंटित करता है और उस ऑब्जेक्ट के लिए एक पॉइंटर लौटाता है। ध्यान दें कि शब्द "ऑब्जेक्ट" का उपयोग यहां शिथिल किया गया है, जिसका अर्थ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के अर्थ में ऑब्जेक्ट के बजाय "कुछ" है।

ढेर-आवंटित वस्तुओं का जीवनकाल प्रोग्रामर द्वारा नियंत्रित किया जाता है। इस ऑब्जेक्ट के लिए मेमोरी तब तक आरक्षित रहेगी जब तक कि प्रोग्रामर इसे फ्री नहीं करता, यानी कॉल करके free()या जब तक प्रोग्राम बाहर नहीं निकलता।

संपादित करें : मैं इस सवाल को नोटिस करने में विफल रहा कि इसे C ++ प्रश्न के रूप में चिह्नित किया गया है। C ++ ऑपरेटर newऔर new[]उसी फ़ंक्शन को निष्पादित करते हैं malloc। ऑपरेटरों deleteऔर के delete[]अनुरूप हैं free। जबकि newऔर deleteआवंटित करने के लिए और सी ++ वस्तुओं विशेष रूप से इस्तेमाल किया जाना चाहिए, के उपयोग mallocऔर freeसी ++ कोड में पूरी तरह से कानूनी है।


1
(+1) "स्टैटिक
एलोकेशन

4

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

  • एक छोटा और सरल वेब सर्वर
  • यूनिक्स कमांड लाइन टूल (कम, बिल्ली, सॉर्ट आदि)
  • कुछ वास्तविक परियोजना जो आप अपने लिए करना चाहते हैं न कि केवल सीखने के लिए

मैं पिछले एक की सलाह देता हूं।


इसलिए मैं सिर्फ एक परियोजना के लिए जाना चाहता हूं जिसे मैं करना चाहता हूं (जैसे एक 2D गेम) और यह माना जाता है कि मुझे पॉइंटर्स की आवश्यकता होगी और सीखना होगा?
ढोका

3
मेरे अनुभव में, वास्तविक परियोजनाएं जो आपकी पहुंच से बाहर हैं, कौशल-वार करना सीखने का सबसे अच्छा तरीका है। अवधारणाओं को छोटे "खिलौना" कार्यक्रमों को पढ़ने और लिखने से सीखा जा सकता है। हालांकि, वास्तव में यह जानने के लिए कि आप उन अवधारणाओं का उपयोग कैसे कर सकते हैं बेहतर कार्यक्रम लिखने के लिए, आपको बस गैर-खिलौना कार्यक्रम लिखना होगा।
विक्टर डाहल

3

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

बिंदुओं का एक विशिष्ट निम्न-स्तरीय कार्यान्वयन द्वारा पॉइंटर्स , जहाँ आप सीधे मेमोरी पतों में हेरफेर कर सकते हैं, बहुत शक्तिशाली हैं, लेकिन उपयोग करने के लिए थोड़ा खतरनाक हो सकता है (जैसे, प्रोग्राम के बाहर मेमोरी स्थानों को इंगित करना)।

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

जैसा कि आपको अप्रत्यक्ष की आवश्यकता क्यों है, सूची काफी लंबी है, लेकिन अनिवार्य रूप से दो प्रमुख विचार हैं:

  1. बड़ी वस्तुओं के मानों को कॉपी करना धीमा है और ऑब्जेक्ट को रैम में दो बार संग्रहीत किया जाएगा (संभावित रूप से बहुत महंगा), लेकिन संदर्भ द्वारा कॉपी करना रैम के केवल कुछ बाइट्स (पते के लिए) का उपयोग करके तात्कालिक पास है। जैसे, मान लें कि आपके पास ~ 1000 बड़ी ऑब्जेक्ट्स (प्रत्येक के बारे में 1MB RAM कह रहा है) मेमोरी में है, और आपके उपयोगकर्ता को वर्तमान ऑब्जेक्ट (जो उपयोगकर्ता द्वारा कार्य किया जाएगा) का चयन करने में सक्षम होना चाहिए। एक चर है selected_objectकि वस्तुओं में से एक के लिए एक संदर्भ है एक नए चर में वर्तमान वस्तु के मूल्य की नकल करने की तुलना में बहुत अधिक कुशल है।
  2. ऐसी जटिल डेटा संरचनाएँ होना जो अन्य वस्तुओं जैसे कि लिंक्ड सूची या पेड़ों को संदर्भित करती हैं, जहाँ डेटा संरचना में प्रत्येक आइटम डेटा संरचना में अन्य वस्तुओं को संदर्भित करता है। डेटा संरचना में अन्य मदों को संदर्भित करने का लाभ का मतलब है कि आपको सूची में प्रत्येक आइटम को स्मृति में चारों ओर स्थानांतरित करने की आवश्यकता नहीं है, क्योंकि आपने सूची के मध्य में एक नया आइटम डाला है (निरंतर समय आवेषण हो सकता है)।

2

पिक्सेल स्तर छवि हेरफेर लगभग हमेशा आसान और तेजी से संकेत का उपयोग कर रहा है। कभी-कभी केवल पॉइंटर्स का उपयोग करना संभव है।


1
मुझे नहीं लगता कि बयान "कभी-कभी केवल संकेत का उपयोग करना संभव है" सच है। ऐसी भाषाएं हैं जो डेवलपर को संकेत नहीं देते हैं, फिर भी उनका उपयोग उसी स्थान पर समस्याओं को हल करने के लिए किया जा सकता है।
थॉमस ओवेन्स

शायद ... मुझे सभी उपलब्ध भाषाओं का ज्ञान नहीं है, लेकिन मैं निश्चित रूप से एक ऐसी भाषा का उपयोग करने के लिए एक कन्वेंशन फ़िल्टर लागू करने के लिए एक रूटीन लिखना नहीं चाहूंगा जिसमें कोई संकेत न हो।
डेव नाय

@ थोमस, जब आप सही होते हैं, तो सवाल सी ++ के बारे में होता है जो डेवलपर को संकेत देता है।
जोनाथन हेंसन

@ जोनाथन यहां तक ​​कि, यदि आप एक ऐसी भाषा में एक समस्या को हल कर सकते हैं जो बिंदुओं को उजागर नहीं करता है, तो उस समस्या को उस भाषा में हल करना भी संभव है जो बिंदुओं का उपयोग किए बिना बिंदुओं को उजागर करता है। यह पहला वाक्य सच बनाता है, लेकिन दूसरा वाक्य असत्य है - (मेरे ज्ञान का सबसे अच्छा करने के लिए) कोई समस्या नहीं है जो संकेत के उपयोग के बिना हल नहीं की जा सकती।
थॉमस ओवेन्स

1
इसके विपरीत, छवि प्रसंस्करण में अक्सर "समन्वय अंकगणित" शामिल होता है - कहते हैं, कोण की साइन और कोसाइन लेते हुए इसे x- और y- निर्देशांक से गुणा करते हैं। अन्य मामलों में सीमा के आसपास या बाहर पिक्सेल पिक्सेल प्रतिकृति की आवश्यकता होती है। इस अर्थ में, सूचक अंकगणित अपर्याप्त है।
रौंग

1

उपयोगकर्ता के बारे में बग को बताए बिना सतह के नीचे कई प्रोग्रामिंग भाषाओं में पॉइंटर्स का उपयोग किया जाता है। C / C ++ आपको केवल उन तक पहुंच प्रदान करता है।

उनका उपयोग कब करें: जितनी बार संभव हो, क्योंकि डेटा की प्रतिलिपि बनाना अक्षम है। उनका उपयोग कब न करें: जब आप दो प्रतियाँ चाहते हैं जिन्हें व्यक्तिगत रूप से बदला जा सकता है। (मूल रूप से ऑब्जेक्ट की सामग्री को मेमोरी में दूसरी जगह कॉपी करने और पॉइंटर वापस करने पर क्या खत्म होगा - इस बार ऑब्जेक्ट 2 की ओर इशारा करते हुए)


1

सी में किसी भी डेटा संरचना कार्यान्वयन के लिए पॉइंटर्स एक आवश्यक हिस्सा हैं और डेटा संरचना किसी भी गैर-तुच्छ कार्यक्रम का एक अनिवार्य हिस्सा हैं।

यदि आप यह जानना चाहते हैं कि यह क्यों है कि संकेत इतने महत्वपूर्ण हैं, तो मैं सुझाव दूंगा कि एक लिंक की गई सूची क्या है और किसी एक का उपयोग किए बिना लिखने की कोशिश कर रहा है। मैंने आपको एक असंभव चुनौती निर्धारित नहीं की है, (HINT: पॉइंटर्स का उपयोग मेमोरी में स्थानों को संदर्भित करने के लिए किया जाता है, आप सरणियों में चीजों को कैसे संदर्भित करते हैं?)।


डेटा संरचनाओं का उल्लेख करने के लिए +1, एल्गोरिदम में उपयोग एक प्राकृतिक परिणाम है।
मैथ्यू एम।

0

एक वास्तविक जीवन उदाहरण के रूप में, एक सीमा ऑर्डर बुक का निर्माण।

उदाहरण के लिए, ITCH 4.1 फ़ीड में "प्रतिस्थापित" आदेशों की अवधारणा है, जहां कीमतें (और इसलिए, प्राथमिकता) बदल सकती हैं। आप आदेशों को निकालने और उन्हें अन्यत्र ले जाने में सक्षम होना चाहते हैं। पॉइंटर्स के साथ डबल-एंडेड कतार को लागू करने से ऑपरेशन बहुत आसान हो जाता है।


0

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

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

मुझे लगता है कि वेब पर जाने और लोगों से यह पूछने की तुलना में, सी, फर्स्ट हैंड, सीखने के लिए अधिक रचनात्मक है। जब आप सी को अच्छी तरह से जानते हैं तो आप इस तरह के सवाल पूछने से परेशान नहीं होंगे, यह पूछने की तरह होगा "टूथब्रश का उपयोग करके कौन सी समस्याएं सबसे अच्छी तरह से हल होती हैं?"


0

भले ही पॉइंटर्स बड़ी मेमोरी ऑब्जेक्ट्स के साथ काम करते समय वास्तव में चमकते हैं, फिर भी उनके बिना ऐसा करने का एक तरीका है।

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

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

  1. आपके पास स्वयं-विस्तारित डेटा संरचनाएं हो सकती हैं। वे संरचनाएं हैं जो अतिरिक्त मेमोरी का दावा करके खुद को विस्तारित कर सकते हैं जब तक कि उनकी क्षमता खत्म हो जाती है। प्रत्येक स्व-विस्तारित संरचना की मुख्य संपत्ति यह है कि इसमें छोटे मेमोरी ब्लॉक (संरचना के आधार पर नोड्स, सूची आइटम आदि) और प्रत्येक ब्लॉक में अन्य ब्लॉक (एस) के संदर्भ शामिल हैं। यह "लिंक्ड" संरचनाएं आधुनिक डेटा प्रकारों के अधिकांश का निर्माण करती हैं: रेखांकन, पेड़, सूचियां आदि।

  2. आप OOP (ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग) प्रतिमान का उपयोग करके प्रोग्राम कर सकते हैं। संपूर्ण ओओपी प्रत्यक्ष चर का उपयोग नहीं करने पर आधारित है, लेकिन कक्षा के उदाहरणों (ऑब्जेक्ट्स) और उन्हें हेरफेर करने के संदर्भ में है। पॉइंटर्स के बिना कोई एकल उदाहरण मौजूद नहीं हो सकता है (भले ही यह बिना पॉइंटर्स के भी स्थिर-केवल कक्षाओं का उपयोग करना संभव हो, लेकिन यह अपवाद नहीं है)।


0

मजेदार, मैंने सिर्फ C ++ के बारे में एक सवाल का जवाब दिया और संकेत के बारे में बात की।

लघु संस्करण आपको तब तक चाहिए जब तक कि आपको 1) लाइब्रेरी का उपयोग करने की आवश्यकता न हो। 2) आपको एक अशक्त संदर्भ की आवश्यकता है।

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

इस भाग पर आपके प्रश्न का उत्तर दिया जा सकता है

यदि आप एक पॉइंटर का उपयोग करते हैं तो सुनिश्चित करें कि यह इन दो स्थितियों में से एक में है। 1) आप इनपुट पास कर रहे हैं जो अशक्त हो सकता है। एक उदाहरण एक वैकल्पिक फ़ाइल नाम है। 2) यदि आप दूर स्वामित्व देना चाहते हैं। जैसे कि यदि आप पॉइंटर पास करते हैं या लौटाते हैं तो आपके पास इसकी कोई भी कॉपी शेष नहीं है और न ही आपके द्वारा दिए गए पॉइंटर का उपयोग करें

ptr=blah; func(ptr); //never use ptr again for here on out.

लेकिन मैंने बहुत लंबे समय तक पॉइंटर्स या स्मार्ट पॉइंटर्स का इस्तेमाल किया है और मैंने अपने एप्लिकेशन को प्रोफाइल किया है। यह बहुत तेज दौड़ता है।

अतिरिक्त नोट: मुझे लगता है कि मैं अपनी खुद की संरचना लिखने के लिए और मैं उन्हें चारों ओर से गुजरती हैं। तो मैं संकेत का उपयोग किए बिना यह कैसे करूं? इसकी एसटीएल कंटेनर नहीं है इसलिए रिफ से गुजरना धीमा है। मैं हमेशा अपनी डेटा सूची / देवताओं / नक्शे और ऐसे लोड करता हूं। मुझे याद नहीं है कि किसी भी वस्तु को वापस करना जब तक कि वह किसी प्रकार की सूची / मानचित्र न हो। एक तार भी नहीं। मैंने सिंगल ऑब्जेक्ट्स के लिए कोड को देखा और मैंने नोटिस किया कि मैं ऐसा कुछ करता हूं { MyStruct v; func(v, someinput); ... } void func(MyStruct&v, const D&someinput) { fillV; }ताकि मैं (सिंगल) के संदर्भ में बहुत ज्यादा रिटर्न ऑब्जेक्ट्स (मल्टीपल) या प्रीलेक्लेट / पास (सिंगल) कर सकूं।

अब यदि आप लिख रहे हैं तो आप खुद के लिए deque, map आदि हैं, आपको पॉइंटर्स का उपयोग करना होगा। लेकिन आप की जरूरत नहीं है एसटीएल और संभवतः इस बारे में चिंता को बढ़ावा दें। आपको केवल डेटा और समाधान लिखने की आवश्यकता है। उन्हें रखने के लिए कंटेनर नहीं;)

मुझे उम्मीद है कि अब आप कभी भी पॉइंटर्स का उपयोग नहीं करेंगे: डी। उन कामों से निपटना सौभाग्य है जो आपको मजबूर करते हैं


0

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


0

मैं बिंदुओं को अपनी तर्जनी के रूप में देखता हूं, हम कुछ चीजों का उपयोग करते हैं:

  1. जब कोई आपसे कुछ मांगता है तो आप उसे नहीं ले जा सकते हैं, जैसे कि सड़क कहाँ है और इसलिए, मैं इस सड़क पर "बात" करूँगा, और यही हम संदर्भ के आधार पर तर्क के मामले में करते हैं
  2. जब किसी चीज को गिनना या ट्रेस करना होता है, तो हम उसी उंगली का उपयोग करेंगे, और यही हम सरणियों में करते हैं

कृपया इस खराब उत्तर को क्षमा करें


0

जैसा कि आपके प्रश्न को C ++ टैग किया गया है, मैं आपके प्रश्न का उत्तर उस भाषा के लिए दूंगा।

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

1. बहुरूपता

एक बेस क्लास पॉइंटर आपको एक वर्चुअल मेथड को कॉल करने की अनुमति देता है जो कि उस पॉइंटर के प्रकार पर निर्भर करता है जो पॉइंटर को इंगित करता है।

2. लगातार वस्तुओं का निर्माण करना

गतिशील रूप से (ढेर के बजाय ढेर पर) ऑब्जेक्ट बनाते समय पॉइंटर्स आवश्यक हैं। यह आवश्यक है जब आप चाहते हैं कि वस्तुओं को जीवन भर उस दायरे से अधिक लंबा होना चाहिए जिसमें इसे बनाया गया है।

"अच्छी परियोजनाओं या हल करने के लिए समस्याओं" के संदर्भ में, जैसा कि दूसरों ने पहले ही यहां कहा है, कोई भी गैर-तुच्छ परियोजना पॉइंटर्स का उपयोग करेगी।


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