संकेत के लिए एक अच्छी व्याख्या क्या है? [बन्द है]


72

अपनी खुद की पढ़ाई में (अपने दम पर, या एक कक्षा के लिए) क्या आपके पास एक "आह हा" पल था जब आप आखिरकार, वास्तव में संकेत समझ गए? क्या आपके पास शुरुआती प्रोग्रामर के लिए उपयोग किया गया स्पष्टीकरण है जो विशेष रूप से प्रभावी लगता है?

उदाहरण के लिए, जब शुरुआती सी में पहली बार पॉइंटर्स का सामना करते हैं, तो वे बस &एस और *एस जोड़ सकते हैं जब तक कि यह संकलित न हो (जैसा कि मैंने खुद एक बार किया था)। शायद यह एक तस्वीर, या वास्तव में अच्छी तरह से प्रेरित उदाहरण था, जिसने आपके या आपके छात्र के लिए "क्लिक" किया। यह क्या था, और इससे पहले कि आप क्या काम करने की कोशिश नहीं करते थे? किसी भी आवश्यक शर्तें (जैसे संरचना, या सरणियाँ) थे?

दूसरे शब्दों में, &एस के अर्थ को समझने के लिए क्या आवश्यक था और *, जब आप उन्हें विश्वास के साथ उपयोग कर सकते हैं? वाक्यविन्यास और शब्दावली या उपयोग के मामलों को सीखना पर्याप्त नहीं है, कुछ बिंदु पर विचार को आंतरिक रूप देने की आवश्यकता है।


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

उदाहरण के लिए:

मैं केवल कुछ हद तक समझने वाले बिंदुओं को सी के रूप में समझता हूं। मैंने अपने दो दोस्तों को दूसरे दोस्त को समझाते हुए सुना, जिन्होंने पूछा structथा कि एक पॉइंटर के साथ क्यों पास किया गया था। पहले दोस्त ने इस बारे में बात की कि इसे कैसे संदर्भित किया जाना चाहिए और संशोधित किया जाना चाहिए, लेकिन यह दूसरे दोस्त से सिर्फ एक छोटी टिप्पणी थी जहां उसने मुझे मारा: "यह अधिक कुशल भी है।" 16 बाइट के बजाय 4 बाइट पास करना अंतिम वैचारिक पारी थी जिसकी मुझे जरूरत थी।


16
'बन्दूक' विधि: फेंक * एस हर जगह यह काम करता है तिल।
माइकल के

15
@ माइकल: हाँ, इसके साथ शुभकामनाएँ।
रॉबर्ट हार्वे

8
यह सवाल एसओ पर हर सेमेस्टर की शुरुआत के तुरंत बाद आता है। नवीनतम अवतार यहाँ है: stackoverflow.com/questions/4118647/...
टिम पोस्ट

10
संकेत के लिए एक अच्छी व्याख्या क्या है? ब्रायन कर्निगन और डेनिस रिची सॉफ्टवेयर इंजीनियरों से नफरत करते हैं।
एडम क्रॉसलैंड

3
डिबगर में कुछ समय सिंगल-स्टेपिंग मशीन कोड खर्च करने के बाद यह मेरे लिए "क्लिक" हुआ। हां, मैं कंप्यूटर आर्किटेक्चर की बुनियादी बातों से परिचित था - मैंने कमोडोर 64 पर असेंबली सीखी और उसके बाद x86 एएसएम बहुत सीधा था। इसलिए मैं पहले से ही एक "पते" की अवधारणा को जानता था, मुझे अभी समझ नहीं आया कि यह सी के वाक्यविन्यास निर्माणों के लिए कैसे मैप किया जाता है।
zvrba

जवाबों:


25

मेमोरी-ए-ग्रिड ग्रिड आरेख

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

आमतौर पर यह मेरे अधिकांश छात्रों के लिए एक "ओह्ह्ह" पल है।

प्रतीक जुगलबंदी

फिर जब यह आता है कि उन्हें भूल जाना बंद करना है कि कैसे और * का उपयोग करना है, तो यह बहुत सरल है: इसे उसी तरह प्रस्तुत करें जैसे वे गणित या गणित की गणना करते हैं। यदि आप घंटे में एक किमी की दूरी को किमी में विभाजित करते हैं, तो आपको किमी / घंटा में गति मिलती है। बाहर होने की क्या जरूरत है। सरल।

बचाव के लिए प्रिंट

बस कुछ बुनियादी उदाहरण हैं जो नेत्रहीन रूप से दर्शाते हैं कि आपने जो इन के साथ समझाया था, वह उन्हें उस चीज़ में आराम देगा जो उन्हें लगता है कि वे समझ गए हैं, या उन्हें "आह, मुझे यह नहीं मिलता है" कहने का अवसर दें।

व्यापक हो

सरल प्रकारों के लिए पॉइंटर्स को कवर करें और सुनिश्चित करें कि वे डेटा प्रकार को संबोधित करने और आकार के बीच अंतर को समझते हैं, फिर संरचनाएं, फिर सरणियाँ और कई स्तर।

फिर सूचक अंकगणित शुरू करें।


परिशिष्ट: पुनरावृत्ति

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

आमतौर पर "क्या ...?" क्षण, और जब आप संख्यात्मक मूल्यों को प्रिंट करने और चरणों को इंडेंट करने के लिए अपने प्रिंटफ में सिर्फ एक और पैरामीटर जोड़ते हैं, तो यह राहत की सांस लेता है।


विकल्प: प्ले-दोह मॉडल और वाटर कप

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

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


वाह, इनाम के लिए धन्यवाद। खुशी है कि जवाब की सराहना की गई।
haylem

इसे ड्रा करें: | लगता है कि कुछ अच्छा शिक्षण!
Spooks

80

मैंने एक बार कहा था कि कोई बहुत समझदार है:

नन वू जिंकसांग ने छठे पितृसत्ता ह्येनेंग से पूछा, "मैंने कई वर्षों तक महापरिनिर्वाण सूत्र का अध्ययन किया है, फिर भी कई क्षेत्र हैं जो मुझे समझ में नहीं आते हैं। कृपया मुझे बताएं।"

देशभक्त ने जवाब दिया, "मैं अनपढ़ हूं। कृपया मेरे लिए पात्रों को पढ़ें और शायद मैं इसका अर्थ समझा सकूंगा।"

नन ने कहा, "आप पात्रों को पहचान भी नहीं सकते हैं। आप तब इसका अर्थ कैसे समझ सकते हैं?"

"सत्य का शब्दों से कोई लेना-देना नहीं है। सत्य की तुलना आकाश में चमकते चंद्रमा से की जा सकती है। इस मामले में शब्दों की तुलना उंगली से की जा सकती है। उंगली चंद्रमा के स्थान की ओर इशारा कर सकती है। हालांकि, उंगली नहीं है। चाँद। चाँद को देखने के लिए, उंगली से परे टकटकी लगाना आवश्यक है, है ना? "


13
चन्द्रमा को देखने के लिए +1। कोन के लिए +1, अगर मैं कर सकता था।
टिम पोस्ट

14
एक उंगली से उठने की आवाज़ क्या है?
एडम क्रॉसलैंड

3
@ अदम जो इस बात पर निर्भर करता है कि आप माउस या ट्रैकपैड का उपयोग कर रहे हैं।
डैनियल जोसेफ

7
@ फ्रेंक यह एक महान उद्धरण था। फिर भी मुझे लगता है कि यह विचार को समझने में मदद नहीं करेगा। विशेष रूप से संकेत करने वालों के लिए कोई नया।
गुलशन

11
यह एक सुंदर कहानी है ... लेकिन मुझे संदेह है कि लोग उस वजह से अप-वोट कर रहे हैं, बजाय इसके कि यह संकेतकर्ताओं को अच्छी तरह से समझाए।
23 अक्टूबर को क्यूरेलसा

46

मैंने पाया कि चित्र बहुत मददगार थे। उदाहरण:

सूचक आरेख


इस तरह के आरेख ने मुझे यह देखने में मदद की कि संकेत अपने स्वयं के चर थे, लेकिन इसमें एक मूल्य था जो किसी अन्य ऑब्जेक्ट का स्थान था, अर्थात सरणी या स्ट्रिंग। इसके अलावा, जब पेंसिल में किया जाता है, तो मैं इसे कागज पर, या चॉकबोर्ड / व्हाइटबोर्ड पर अपने कार्यक्रम का पता लगाने के लिए उपयोग कर सकता हूं।


4
या तो "पॉइंटर" का मान 4 होना चाहिए या सरणी सूचकांकों (या मेमोरी एड्रेस) को 0. से शुरू होना चाहिए। अन्यथा, कोई पॉइंटर जो मान 3 को स्थान 4 पर रखता है?
MAK

++ यह ठीक उसी तरह है जैसे मैं इसे समझाने जा रहा था। मैंने फोरट्रान में शुरू किया (बेहतर या बदतर के लिए!)। फ़ोर्ट्रान में, फिर से, हमने संरचना के सरणियों के बजाय समानांतर सरणियों का उपयोग किया ( नई जैसी कोई चीज नहीं )। यदि एक सरणी में सरणियों में "एक और पंक्ति" का सूचकांक होता है, तो हमने इसे "सूचक" कहा, और यह रोमांचक था। हमने लिंक्ड लिस्ट, पेड़ बनाए हैं, आप उसका नाम दें।
20

2
मुझे लगता है कि सबसे अच्छी तरह से बताए गए चित्रों का उपयोग करके संकेत दिया गया है कि क्या संग्रहीत किया जाता है, और तीर इंगित करने के लिए कहां इंगित करता है।
गैबलिन

32

जब मैंने पहली बार पॉइंटर्स के बारे में "सीखा", ​​तो मैं इसमें जोर देने वाला था। मेरे विश्वविद्यालय ने निर्णय लिया था कि जावा के चारों ओर पाठ्यक्रम को केंद्र में लाने से पहले मैंने बहुत समय पहले निर्णय लिया था, इसलिए जब मेरे डेटा स्ट्रक्चर्स के प्रोफेसर ने सी पर एक व्याख्यान दिया और हमें संकेत के साथ एक XOR- सूची लागू करने के लिए कहा, तो मुझे लगा जैसे मैं कुछ करने के लिए मिल रहा था। मेरे सिर के ऊपर से रास्ता

मुझे परिभाषा समझ में आई:

पॉइंटर एक वैरिएबल होता है जिसमें एक वैरिएबल का पता होता है

लेकिन मुझे अभी भी अवधारणा का एक बड़ा हिस्सा समझ नहीं आया। पीछे देखते हुए, मुझे लगता है कि यह तीन चीजों पर केंद्रित है:

  1. स्मृति स्थान वास्तव में क्या है ? (उस समय मैंने कंप्यूटर संगठन की कक्षा नहीं ली थी)

  2. अजीब वाक्यविन्यास (तो उम ... क्यों यह बिल्कुल "int * ip" की तरह परिभाषित किया गया है, लेकिन फिर बाद में मैं "ip" के रूप में चर का संदर्भ देता हूं?

  3. केवल चर का उपयोग करने के बजाय एक चर के पते को स्टोर करना कितना फायदेमंद है?

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

लेकिन मेरा "अहा" क्षण दूर तक था जिस तरह से K & R ने एक साधारण पॉइंटर को परिभाषित करने के अजीब सिंटैक्स को समझाया। मैंने पूरे पुस्तक में (जिसमें मैं अपनी समझ को आगे बढ़ाने के लिए अपने स्वयं के शब्दों में पुस्तक के द्वारा बनाए गए बिंदुओं को फिर से लिखता हूं) में नोट्स लिए, और यह उसी से संबंधित है:

पॉइंटर एक वैरिएबल होता है जिसमें एक वैरिएबल का पता होता है। एक सूचक दोनों परिभाषित और dereferenced (स्मृति स्थान पर संग्रहीत मूल्य है कि यह इंगित करता है उपज) * * * ऑपरेटर के साथ; अभिव्यक्ति महामारी है।

Ex.: 
   int a;      /* Variable 'a' is an integer */

   int *ip;   /* Variable ip is a pointer and dereferencing it gives an integer.
                 In other words, the expression *ip is an int, so ip is a pointer
                 to an int */

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

char (*(x())[])()

सब सब में, मुझे लगता है कि संकेत की अवधारणा की आवश्यकता है:

  1. कंप्यूटर में मेमोरी कैसे रखी जाती है (और क्या मेमोरी है) की एक बुनियादी समझ है।

  2. कितना शक्तिशाली संकेत हो सकता है इसका ज्ञान (वास्तविक विश्व उपयोग, केवल एक और अमूर्त अवधारणा नहीं है जिसे वे सीखने के लिए सीखते हैं)।

  3. पदानुक्रम की व्याख्या करना बोलचाल की भाषा में "एक सूचक की परिभाषा" के रूप में जाना जाता है

तो सब के सब, मुझे लगता है कि संकेत के बारे में सीखते समय कम से कम 3 "अहा" क्षण होने चाहिए। मैं अभी भी एक छात्र हूं, इसलिए मैंने सोचा कि आप किसी ऐसे व्यक्ति के दृष्टिकोण की सराहना करेंगे जो अभी भी (अपेक्षाकृत) अवधारणा सीखने के लिए नए सिरे से है।


3 के लिए +1 "आह हा!" monents। ग्रोइंग पॉइंटर्स परतों में आते हैं। मैंने लंबे समय तक "समझा" बिंदुओं को महसूस किया इससे पहले कि मैं केवल आधे समझा बिंदुओं को संकेत देता हूं :)
बाइनरी वॉरियर

मुझे लगता है कि आप इसमें पूरी तरह से सही हैं कि 'समझ में नहीं आने वाले बिंदुओं' का एक बहुत बड़ा हिस्सा वास्तव में अजीब सी सिंटैक्स पर ट्रिपिंग है। [सोचता है: मुझे आश्चर्य है कि इस तरह के वाक्यविन्यास के साथ कितना मुश्किल होगा: PointerTo<int> a]
बेंजोल

सहमत, @ बैंजोल। मुझे आश्चर्य है कि वाक्य रचना int* ipअधिक सामान्य नहीं है। अंत में मैंने कोड को समझना शुरू कर दिया एक बार मैंने कोड देखा जो इस तरह से स्वरूपित था। तब मैं इसे पढ़ सकता था "आईपी टाइप इंट पॉइंटर का है।"
जैकब

19

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

मैं हमेशा अपने डेस्कटॉप पर एक txt फ़ाइल और फ़ाइल के लिए दो शॉर्टकट बनाकर सरलता से इस पर काम करता हूं। शॉर्टकट की प्रतिलिपि बनाने और हटाने के बाद आप देख सकते हैं कि लोग 'संदर्भ' के पीछे के विचार को समझ सकते हैं।

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


यह एक बुरा सादृश्य नहीं है। किसी को भी जोड़ने के लिए बस कुछ बिंदुओं का शाब्दिक अर्थ है "हार्ड-लिंक" हमेशा अपने लक्ष्य को इंगित करेगा भले ही यह निर्देशिकाओं को बदल दे, एक सूचक मूल मेमोरी को इंगित करेगा भले ही ऑब्जेक्ट को स्थानांतरित किया गया हो। एक "हार्ड-लिंक" आपको बताएगा कि क्या लक्ष्य अब मौजूद नहीं है, एक डैंगलिंग पॉइंटर पॉइंटर को NULL पर सेट किया जाना चाहिए।
स्नूम्कोडोनाल्ड

एक हार्ड लिंक एक संदर्भ की तरह है जो स्मार्ट पॉइंटर
jk में

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

13

8-10 साल पहले, मैंने एक कम्युनिटी कॉलेज में इंट्रो "C" कोर्स पढ़ाया। यह हमेशा एक मजेदार विषय था। सबसे अच्छा काम करने के लिए क्या लग रहा था, और यह डब्ल्यू / एक सहकर्मी पर चर्चा करने के बाद कुछ समय के लिए एक कॉफी कप और अपने हाथ का उपयोग करना था।

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

एक करीबी हाथ अशक्त था, मेरे सिर पर इशारा करने वाली उंगली (एक नकली बंदूक की तरह) एक झूलने वाला सूचक था।

फिर डिबगर के माध्यम से कुछ प्रदर्शनों और यात्राओं के साथ, यह अधिकांश के साथ क्लिक किया।


3
आपने पहले ही मुझे भ्रमित कर दिया है।
kirk.burleson

1
@ किर्क, कैसे? मुझे देखने दो कि क्या मैं इसे साफ कर सकता हूं।
DevSolo

4
++ इन चीजों के बारे में सोचने के लिए आपको पढ़ाने जैसा कुछ नहीं है।
माइक डनलैवी

विश्वविद्यालय में मेरे एक व्याख्याता ने एक समान काम किया, कॉफी कप के बजाय छात्रों (जिनमें से एक "नील", जोड़ा हंसी के लिए) का उपयोग कर रहा था। दर्शकों पर हाथ से हाथ हिलाकर इशारा करना एक झूलने वाला सूचक था, क्योंकि यह किसी भी चीज़ की ओर इशारा कर सकता था।
काज़ ड्रैगन

2
एक डैंगलिंग पॉइंटर, नील की ओर इशारा करने जैसा है और फिर उसे बदलने के बिना अपनी कुर्सी छोड़ दें, जहां आप इशारा कर रहे हैं ... फिर उस पॉइंटर का अनुसरण करने की कोशिश कर रहे हैं और आपको जो वहाँ मिल रहा है, उसकी परवाह किए बिना एक नील के रूप में व्याख्या कर रहा है।
जॉन पूर्डी

10

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

जो चीज मुझे चिंतित करती है, वह यह है कि मैंने कभी भी संकेतकर्ताओं की अवधारणा को समझना मुश्किल नहीं पाया। इसलिए जब आप यहां "आप आखिरकार कब मिले" बार-बार, आप सोचने लगते हैं:

क्या मैं वास्तव में इसे प्राप्त करता हूं? शायद मैंने कभी नहीं किया?

शायद इसका कारण यह है कि अवधारणा एक मुश्किल है, ऐसा इसलिए है क्योंकि हम हर किसी को बता रहे हैं जो अभी तक उनसे मुठभेड़ कर रहा है कि संकेत इतने कठिन हैं, और यहां सौ तरीके हैं जिनसे आप सीख सकते हैं?

बस उस विचार को वहाँ फेंक देना, निश्चित रूप से व्यक्तिगत रूप से मुझे एक अच्छा आरेख पसंद है और स्टीव गिब्सन हमेशा कुछ भी समझाने का एक शानदार काम करता है !


दिलचस्प ... उस समय आपने किस भाषा का इस्तेमाल किया था? मुझे लगता है कि सी सिंटैक्स बहुत सारे लोगों को यात्रा करता है। यदि आप पहले विधानसभा जानते थे तो मैं देख सकता था कि इसका एक कारण है। [BTW, मैं इसे वोट देना चाहता हूं, लेकिन मैं आज के लिए अपनी टोपी तक पहुँच गया।]
मैक्नील

दिलचस्प रूप से पर्याप्त है, मुझे लंबे समय तक "खतरनाक" पॉइंटर्स का कोई ज्ञान नहीं था, पायथन (और विश्वविद्यालय में जावा) में काम कर रहा था। फिर मैंने एक "ऑब्जेक्ट ओरिएंटेड मेथड्स" मॉड्यूल लिया, जिसमें C ++ को पसंद की भाषा के रूप में इस्तेमाल किया और सीधे वहां पर dove किया।
मार्कस Whybrow

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

+1 मुझे पता नहीं है कि लोग सोचते हैं कि संकेत कठिन या रहस्यमय हैं।
गगम्बेट

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

7

मुझे सी में पॉइंटर्स के साथ बहुत समस्या नहीं थी, लेकिन ऐसा इसलिए हो सकता है क्योंकि मुझे पहले कोडांतरक सीखना था। यह वास्तव में एक राहत थी कि अपने आप को किसी भी अधिक पते का प्रबंधन नहीं करना था। तो हो सकता है कि उत्तर (यह मानते हुए कि आप कुछ सिखा रहे हैं) छात्रों को काम करने के लिए एक असेंबली भाषा देने के लिए है। वे "हैलो, दुनिया" की तुलना में अधिक परिष्कृत कुछ भी लिखने की प्रक्रिया में इसका पता लगाएंगे


एक सादृश्य का उपयोग करने के बजाय एक अधिक आदिम अमूर्तता को अपनाने के लिए +1।
बेनामी टाइप

मेरे हाई स्कूल में, कंप्यूटर अध्ययन की एक इकाई एक माचिस कंप्यूटर का अध्ययन करने के लिए समर्पित थी , जिसे ब्लैकबोर्ड से कभी भी छूने या वास्तविक कंप्यूटर को शामिल किए बिना सिखाया जा सकता है।
रवांग

@ लॉरी कोलमैन, विधानसभा !!!!!!!!!!! मैं सी। से पहले इसे पहले आज़माना चाहता हूं। कृपया मुझे बताएं कि सीखना कहाँ से शुरू करना है। फ्री ईबुक, फ्री पीडीएफ? आईडीई? कृप्या!!!!!!!!!!!!!!!!!!!
स्पेसज ली वांग

7

पॉइंटर एक वैरिएबल होता है जिसका मान दूसरे वेरिएबल का मेमोरी एड्रेस होता है।


सुरुचिपूर्ण, इसे और अधिक जटिल क्यों बनाते हैं।
बजरके फ्रायंड-हैनसेन

यदि संकेत तुरंत सहज और उपयोगी नहीं लगते हैं, तो उन्हें गलत तरीके से समझाया गया है।
जॉन पूर्डी 11:10

6

मैंने वास्तव में संकेत के बारे में कैसे सीखा? कॉलेज के एक साधारण संकलक नए साल का लेखन करके।

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


मेरे सीएस पाठ्यक्रम की स्मृति के लिए +1 जहां मुझे बिल्कुल स्पष्टीकरण था
गैरी रोवे

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

+1 सादृश्य उसी अवधारणा को बनाए रखता है जैसा कि बारफील्डम द्वारा समझाया गया था, लेकिन अधिक वास्तविक जीवन दृष्टिकोण के साथ।
कार्तिक श्रीनिवासन

5

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

  • वे अलग-अलग प्रकृति के भी चर हैं। मान लें कि चर स्थान में दो परतें हैं। विभिन्न प्रकार के सामान्य चर ऊपरी परत में और निचली परत में इंगित होते हैं। इस आंकड़े की तरह-

    वैकल्पिक शब्द

  • जैसा कि नाम 'पॉइंटर' से पता चलता है, संकेत किसी चीज को इंगित कर सकते हैं। जैसे हमारी उंगली किसी वस्तु को इंगित कर सकती है। वे किन बातों की ओर इशारा करते हैं? ये सामान्य चर हैं। संक्षेप में, "संकेत सामान्य चर की ओर इशारा करते हैं"।

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

    int *pointer;
    
  • फिर, एक सूचक एक चर के साथ कैसे जुड़ा हुआ है? &इस कथन की तरह चर से पहले ऑपरेटर का उपयोग करना-

    pointer = &variable;
    
  • चर की ओर संकेत करके सूचक का उपयोग कैसे किया जाता है? यह भी तारांकन ( *) के साथ नाम से पहले किया जाता है । फिर इसका उपयोग उस चर के स्थान पर किया जा सकता है, जो अभी इंगित कर रहा है-

    *pointer = var1 + var2;
    

    के बजाय

    variable = var1 + var2;
    
  • अब, कुछ कोड के साथ पॉइंटर्स के साथ खेलें। बस अब संकेत की इस विशेषताओं के लिए उपयोग किया जाता है। इस बिंदु तक, हम बात कर रहे हैं कि संकेत क्या करते हैं। एक बार जब आप इसके साथ ठीक हो जाते हैं, तो यह अध्ययन करना शुरू कर दें कि कैसे पॉइंटर्स कुछ चर की ओर इशारा कर रहे हैं और यदि सामान्य अंकगणितीय ऑपरेशन उन पर लागू होते हैं तो वे कैसे प्रतिक्रिया करते हैं। फिर पॉइंटर्स और सरणियों और पॉइंटर्स टू पॉइंटर्स के बीच संबंध के लिए जाएं।

यह सब मैं सीखने के बिंदुओं के बारे में सुझाव दूंगा।


मैं "पहले यह क्या करता है फिर कैसे" प्रक्रिया का पालन करना चाहता था। अमूर्त!
गुलशन

5

प्रश्न की संशोधित आवश्यकता के समर्थन में संपादित

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

char s[] = "Hello, world!";
printf("%s",s);

सभी अच्छी तरह से और अच्छा, यह सिर्फ चार वर्णों (मेरी छोटी दुनिया में 8 बिट प्रति चरित्र) के साथ एक शून्य चरित्र के साथ अंत में यह दिखाने के लिए है कि यह कहां समाप्त होता है। Printf सिर्फ उस सरणी को लेता है और इसे प्रिंट करने पर चलता है। लेकिन क्या होगा अगर मैं इस स्ट्रिंग को एक फ़ंक्शन में पारित करना चाहता हूं?

void print_str(char* p) {
  printf("%s",p);
}

क्या मैनुअल कहता है, लेकिन वह क्या है * सब के बारे में? हम्म, चार * का अर्थ है "एक चार करने के लिए सूचक"। ठीक है ... मुझे खो दिया। तब यह मुझ पर हावी हो गया कि चार * s [0] के बराबर p बनाता है। ठीक है, मैं इसका उपयोग कर सकता हूं, लेकिन मैंने अभी भी नहीं सोचा है कि संकेत क्या हैं। मेरा मतलब है, मैं इनमें से किसी एक चीज़ के साथ कुछ डेटा कैसे सेट करूं? फिर से मैनुअल करने के लिए ...

char* p = "Hello World!";

जैसा कि मैंने ऊपर लिखा है मैं अपने आप से कह रहा हूं "एक चारित्र के लिए सूचक घोषित करें और इसे वर्णों के बराबर सेट करें"। किसी भी तरह सूचक सरणी की आवश्यकता को दूर करता है। लगता है कि यह संकलक एक बदलाव के लिए मेरे लिए कुछ सामान कर रहा है। तो मैं इस सूचक के साथ सरणी कैसे बदल सकता हूं? मुझे पता है कि मैं सरणी संस्करण का उपयोग कर सकता हूं

 s[2] = 'L'; 

लेकिन "सूचक बात" में बराबर क्या है? उस मैनुअल से फिर से ...

*(p+2) = 'L';

मुझे लगता है कि * का अर्थ है "स्मृति पते की सामग्री" और (p+2)है s[2]। जिसका मतलब था कि पॉइंटर पी था ... बस ... ए ... एड्रेस ... बोंग!

कि आत्मज्ञान की ध्वनि है। मैंने अचानक संकेत दिया (यह बहुत समय पहले था, हम पुराने टाइमर बाद में "ग्रॉक" नहीं करते थे)। यह सिर्फ अप्रत्यक्ष था।


मूल:

ठीक है, मेरा 2 सी मूल्य:

कल्पना कीजिए स्मृति बक्से का एक गुच्छा है। प्रत्येक बॉक्स के किनारे पर एक नंबर (पता) होता है। प्रत्येक बॉक्स में एक संख्या (सामग्री) होती है। आप इन बॉक्स के साथ 2 तरीकों से काम कर सकते हैं: चर (मुझे बॉक्स एन की सामग्री चाहिए), पॉइंटर्स (मुझे बॉक्स एन में जो कुछ भी है, बॉक्स की सामग्री चाहिए )। संकेत केवल अप्रत्यक्ष हैं।

और बड़े उत्तर के लिए जो आपको सब कुछ कवर करता है, जिसे आपको कभी भी जानना होगा - इसे पढ़ें


++ जिस तरह से मैंने विषय पढ़ाया है, वह कमोबेश यही है।
माइक डनलैवी

ओपी आवश्यकताओं का समर्थन करने के लिए संपादित लेख।
गैरी रोवे

आप अपने स्ट्रिंग्स के अंत में अतिरिक्त NUL वर्णों का उपयोग किस मैनुअल से कर रहे थे?
रोब गिलियम

@raimesh एक बहुत पुराना (1991 के आसपास)। जो याद नहीं कर सकते।
गैरी रोवे

1991 सी भाषा के मैनुअल के लिए यह पुराना नहीं है - के एंड आर का पहला संस्करण 1978 में प्रकाशित हुआ था! बस यह अनुमान लगाया जाता है कि वहाँ कभी कोई मैनुअल था जो सुझाव देता था कि आपको अपने स्ट्रिंग स्थिरांक के अंत में \ 0 डालने की आवश्यकता है। (वास्तव में, इसे फिर से देखते हुए, क्या आपका मतलब \ n रखना था?)
रॉब गिलियम

4

लकड़ी के कुछ छोटे खंड प्राप्त करें।

एक छोर पर धातु के हुक जोड़ें, और दूसरे को धातु की आंखें।

अब आप उन सामानों में एक लिंक्ड सूची कर सकते हैं, जिनके साथ आप खेल सकते हैं।

इस भौतिक प्रस्ताव के साथ समझाने की कोशिश करें। मैं अक्सर यह चाहता था कि जब मैं प्रथम वर्ष (नए सिरे से) छात्रों को पॉइंटर्स सिखाऊँ।

थोड़ा धातु हुक सूचक है, लकड़ी के ब्लॉक को इंगित की गई चीज़।

मैं किसी को भी ब्लॉक के साथ खेलने के बाद इसे प्राप्त करने के लिए नहीं।


4

मैंने अपने जीवन को आसान बना दिया जब मैंने बस सभी फुल को हटा दिया और कुछ जादुई इकाई (ग्रेड 11 में बहुत पहले) के बजाय सूचक को किसी अन्य चर के रूप में मानना ​​शुरू कर दिया .. बस 3 बातें जानिए:

  1. पॉइंटर एक वैरिएबल होता है जो दूसरे वैरिएबल (या सिर्फ किसी एड्रेस) के पते को स्टोर करता है।
  2. * पॉइंटर चर में संग्रहीत मेमोरी स्थान पर मान प्राप्त करने के लिए उपयोग किया जाता है।
  3. & ऑपरेटर एक मेमोरी लोकेशन का पता देता है।

बाकी सिंटैक्टिक शुगर और सामान्य ज्ञान है .. बस इसे लटका पाने के लिए पॉइंटर्स का उपयोग करके कुछ सरल सी प्रोग्राम (जैसे लिंक्ड लिस्ट लाइब्रेरी को लागू करना) लिखें।


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

2

मैं अपने पॉइंटर्स-अहा-पल के आसपास की परिस्थितियों को काफी याद नहीं रख सकता, लेकिन मैंने सी-स्टाइल एरे की मेरी समझ के आसपास की स्मृति को फिर से परिष्कृत कर दिया है। (अर्थात arr[3]जैसा है *(arr+3))

जब भी मैं किसी पॉइंटर-स्थिति पर होता हूं, किसी कारण से मुझे पॉइंटर्स को सरणियों के रूप में देखने में काफी मदद मिलती है।


2

मूल रूप से @ गैरी रोवे ने सही मॉडल पेश किया। उन पर पतों (संख्याओं) के साथ बक्से के एक सेट के रूप में मेमोरी। प्रत्येक बॉक्स एक मान (संख्या) संग्रहीत करता है।

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

यदि vएक चर (बॉक्स) है, तो कथन

  • vका अर्थ है v, अर्थात मुझे वह दे दो जो बॉक्स में है
  • *vका अर्थ है कि मूल्य के संदर्भ में vमुझे दे दो, मुझे दे दो क्या मूल्य के द्वारा संदर्भित बॉक्स में हैv
  • &vइसका मतलब है संदर्भ v, यानी मुझे बॉक्स पर पता दें

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

संकेत व्याख्या का विषय हैं। मुझे लगता है कि यह समझाने से चीजें आसान हो जाती हैं। और सूचक अंकगणितीय अत्यंत सरल और सहज संचालन हैं यदि 10 चर की स्मृति के साथ एक सरल उदाहरण दिखाया जाए।


2

स्पष्टीकरण है कि मैं वास्तव में grocked था:

जमीन के टुकड़ों पर बने विभिन्न घरों के साथ एक शहर ग्रिड पर विचार करें। अपने हाथ में आप कागज का एक टुकड़ा रखते हैं। कागज पर आपने लिखा है:


डेविड का घर,

112 तो और इतनी सड़क।


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

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


2

यदि आप पॉइंटर्स को समझाना चाहते हैं तो आपको मेमोरी को पहले समझाना होगा। मैं आमतौर पर ग्राफ पेपर / स्क्वेर्ड पेपर का उपयोग पंक्तियों और स्तंभों के साथ करता हूं। यदि "छात्र" स्मृति को समझता है तो वह समझ सकता है कि पता क्या है। अगर आपको पता मिला तो आपको संकेत मिल गए।

आप इस अमूर्त के साथ खेल सकते हैं। जैसे एक वर्ग का पता (संख्या) दूसरे वर्ग में लिखें। अब पॉइंटर स्क्वायर से डेस्टिनेशन स्क्वायर तक एक तीर खींचें। अब सूचक को अधिलेखित करें (जैसे यह वृद्धि) और तीर समायोजित करें। किसी अन्य वर्ग में एक पता लिखें और छात्र को तीर खींचने दें ...

अगला चरण: कुछ वर्गों (जैसे सूचक) को एक नाम दें। अब आप dereferencing की व्याख्या कर सकते हैं। बस।


2
मुझे एक "कंप्यूटर" की याद दिलाता है जिसका उपयोग मैं अपने हाथों को एक पर करने से पहले कर सकता था जो वास्तव में इलेक्ट्रॉनों का उपयोग करता था - कार्डबोर्ड "कार्डिक" मुझे लगता है कि इसे कहा जाता था। वस्तुतः, अन्य गिने हुए बॉक्सों से संख्या प्राप्त करने के लिए गिने हुए बक्सों में संख्याएँ लिखना। यह शैक्षिक था और मुझे वास्तविक माइक्रोप्रोसेसर पर पॉइंटर्स को समझने में कभी परेशानी नहीं हुई।
डैरनवे

2

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

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


2

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


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

2

मेरी "अहा!" पल आया इस ट्यूटोरियल में:

सी में पॉइंटर्स और एरर्स पर एक ट्यूटोरियल

सटीक होने के लिए, यह इस अध्याय में आया: अध्याय 3: संकेत और तार

और भी सटीक होने के लिए, यह इस वाक्य के साथ आया:

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

जब मैंने पढ़ा कि, बादलों ने भाग लिया और स्वर्गदूतों ने तुरही के पंखे उड़ा दिए।

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

मैं कभी सी प्रोग्रामर नहीं बना, लेकिन मैं एक .NET प्रोग्रामर बन गया, और ऑब्जेक्ट्स और ऑब्जेक्ट रेफरेंस उसी तरह काम करते हैं; ऑब्जेक्ट का संदर्भ मान (और इस प्रकार कॉपी किया गया) द्वारा पारित किया जाता है, लेकिन ऑब्जेक्ट स्वयं कॉपी नहीं किया जाता है। मैंने कई प्रोग्रामर के आस-पास काम किया है जो इस बात को नहीं समझते हैं क्योंकि उन्होंने कभी पॉइंटर्स नहीं सीखा है।


1

चाल यह समझाने के लिए है कि किसी चीज़ का स्थान और चीज़ अपने आप में एक समान नहीं होती है, जैसे पाइप की तस्वीर पाइप नहीं होती है । जब आप किसी चीज को हिलाते हैं, तो उसका स्थान बदल जाता है। स्थान बना रहता है और कोई अन्य चीज वहां रखी जा सकती है।


1

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


1

कोड दिया:

int v=42; // एक साधारण चर घोषित करना और आरंभ करना

int *p = &v; // चर v को बिंदु p बना रहा है

उपरोक्त कोड के बारे में कहा जा सकता है:

int * p // "int pointer p" ... यह है कि आप कैसे सूचक को int int के चर के लिए घोषित करते हैं

*p // "पी द्वारा इंगित किया गया" ... यह वह डेटा है जो p को इंगित करता है, इसका v के समान है।

&v // "चर v का पता" ... यह पी के लिए शाब्दिक मूल्य का प्रतिनिधित्व करता है


1

http://cslibrary.stanford.edu/

इस साइट में सीखने के बिंदुओं और स्मृति प्रबंधन के लिए शानदार ट्यूटोरियल हैं।

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


1

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

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

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

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

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


0

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


0

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


0

ऐसा करने से पहले, मैं समझाता हूं कि प्रोग्रामिंग में "सब कुछ मेमोरी का उपयोग करता है", और (स्टैटिक) चर आवंटन मेमोरी में होता है। मैं यह भी बताऊंगा कि मेमोरी एड्रेस क्या है, और मेमोरी स्पेस, मेमोरी एड्रेस और वेरिएबल्स के बीच का संबंध।

अंत में, मैं समझाता हूं कि पूर्णांक डेटा प्रकार और चर, स्ट्रिंग डेटा प्रकार और चर हैं ... और इसी तरह, यह समझाने तक कि स्मृति पते को संग्रहीत करने वाला एक विशेष डेटा प्रकार है, जिसमें 0 "" जैसे खाली मान हैं, null कहा जाता है ।

और, अंत में, गतिशील रूप से आवंटित चर बिंदुओं के उपयोग के माध्यम से।

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