डेल्फी में पॉइंटर्स को समझना और उपयोग करना

भले ही संकेत के रूप में महत्वपूर्ण नहीं हैं डेल्फी जैसा कि वे सी या में हैं सी ++, वे ऐसे "बुनियादी" उपकरण हैं जिनके साथ लगभग कुछ भी करना है प्रोग्रामिंग कुछ फैशन में संकेत के साथ सौदा करना चाहिए।

यह इस कारण से है कि आप पढ़ सकते हैं कि कैसे एक स्ट्रिंग या ऑब्जेक्ट वास्तव में सिर्फ एक पॉइंटर है, या यह कि ऑनक्लिक जैसे इवेंट हैंडलर वास्तव में एक प्रक्रिया के लिए एक पॉइंटर है।

Pointer to Data Type

सीधे शब्दों में कहें, एक सूचक एक चर है जो स्मृति में किसी भी चीज का पता रखता है।

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

ज्यादातर समय, डेल्फी में संकेत एक विशिष्ट प्रकार की ओर इशारा करते हैं:

वर
iValue, j: पूर्णांक; pIntValue: ^ पूर्णांक;
शुरू
iValue: = 2001; pIntValue: = @iValue;... j: = pIntVueue ^;
समाप्त
;

वाक्य - विन्यास एक सूचक डेटा प्रकार की घोषणा करने के लिए एक का उपयोग करता है कार्यवाहक (^). उपरोक्त कोड में, iValue एक पूर्णांक प्रकार चर है और pIntValue पूर्णांक प्रकार सूचक है। चूँकि एक पॉइंटर मेमोरी में एक एड्रेस से ज्यादा कुछ नहीं है, हमें इसे iValue पूर्णांक चर में संग्रहीत मान का स्थान (पता) असाइन करना होगा।

instagram viewer

@ ऑपरेटर एक चर (या एक फ़ंक्शन या प्रक्रिया जैसा नीचे देखा जाएगा) का पता देता है। @ ऑपरेटर के बराबर है Addr फ़ंक्शन. ध्यान दें कि pIntValue का मान 2001 नहीं है।

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

ध्यान दें कि जब "^" पॉइंटर वेरिएबल के बाद दिखाई देता है, तो यह पॉइंटर को डी-रेफर करता है; अर्थात्, यह पॉइंटर द्वारा रखे गए स्मृति पते पर संग्रहीत मान लौटाता है। इस उदाहरण में, वैरिएबल j का iValue के समान मूल्य है। ऐसा लग सकता है कि इसका कोई उद्देश्य नहीं है, जब हम केवल iValue to j असाइन कर सकते हैं, लेकिन यह कोड विन एपीआई के अधिकांश कॉल के पीछे है।

निलिंग पॉइंटर्स

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

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

चरित्र संकेत

मौलिक प्रकार PAnsiChar और PWideChar AnsiChar और WideChar मानों की ओर संकेत करते हैं। जेनेरिक PChar एक चर चर के लिए एक सूचक का प्रतिनिधित्व करता है।

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

रिकॉर्ड करने के लिए संकेत

जब हम किसी रिकॉर्ड या अन्य डेटा प्रकार को परिभाषित करते हैं, तो उस प्रकार के पॉइंटर को परिभाषित करना भी एक आम बात है। यह स्मृति के बड़े ब्लॉकों की नकल के बिना प्रकार के उदाहरणों में हेरफेर करना आसान बनाता है।

रिकॉर्ड (और सरणियों) को इंगित करने की क्षमता जटिल डेटा संरचनाओं को लिंक की गई सूचियों और पेड़ों के रूप में स्थापित करना बहुत आसान बनाती है।

प्रकार
pNextItem = ^ TLinkedListItem
तिनलीकेडलिस्टम् = अभिलेखsName: स्ट्रिंग; iValue: पूर्णांक; NextItem: pNextItem;
समाप्त
;

लिंक्ड लिस्ट के पीछे का विचार यह है कि हम नेक्स्ट इटेम रिकॉर्ड फील्ड के अंदर एक लिस्ट में अगले लिंक्ड आइटम को स्टोर करने की संभावना दें।

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

प्रक्रियात्मक और विधि संकेत

डेल्फी में एक और महत्वपूर्ण सूचक अवधारणा प्रक्रिया और विधि संकेत है।

किसी प्रक्रिया या कार्य के पते की ओर संकेत करने वाले बिंदु को प्रक्रियात्मक बिंदु कहा जाता है। विधि संकेत प्रक्रिया बिंदु के समान हैं। हालांकि, स्टैंडअलोन प्रक्रियाओं की ओर इशारा करने के बजाय, उन्हें कक्षा के तरीकों की ओर इशारा करना चाहिए।

मेथड पॉइंटर एक ऐसा पॉइंटर होता है, जिसमें नाम और वस्तु दोनों के बारे में जानकारी होती है, जिसे इनवॉइस किया जाता है।

पॉइंटर्स और विंडोज एपीआई

डेल्फी में पॉइंटर्स के लिए सबसे आम उपयोग सी और सी ++ कोड में हस्तक्षेप कर रहा है, जिसमें विंडोज एपीआई तक पहुंच शामिल है।

खिड़कियाँ एपीआई फ़ंक्शन कई प्रकार के डेटा प्रकारों का उपयोग करते हैं जो डेल्फी प्रोग्रामर के लिए अपरिचित हो सकते हैं। एपीआई फ़ंक्शन को कॉल करने में अधिकांश पैरामीटर कुछ डेटा प्रकार के संकेत हैं। जैसा कि ऊपर कहा गया है, हम विंडोज एपीआई फ़ंक्शन को कॉल करते समय डेल्फी में अशक्त-समाप्त स्ट्रिंग्स का उपयोग करते हैं।

कई मामलों में, जब API कॉल डेटा संरचना में बफर या पॉइंटर में मान देता है, तो API कॉल करने से पहले इन बफ़र्स और डेटा संरचनाओं को एप्लिकेशन द्वारा आवंटित किया जाना चाहिए। SHBrowseForFolder विंडोज एपीआई फ़ंक्शन एक उदाहरण है।

सूचक और मेमोरी आवंटन

पॉइंटर्स की वास्तविक शक्ति एक तरफ मेमोरी को सेट करने की क्षमता से आती है जबकि कार्यक्रम निष्पादित हो रहा है।

कोड का यह टुकड़ा यह साबित करने के लिए पर्याप्त होना चाहिए कि पॉइंटर्स के साथ काम करना उतना कठिन नहीं है जितना कि यह पहले लग सकता है। इसका उपयोग प्रदान किए गए हैंडल के साथ नियंत्रण के पाठ (कैप्शन) को बदलने के लिए किया जाता है।

प्रक्रिया GetTextFromHandle (hWND: थैंडल);
वर
pText: PChar; // एक सूचक को चार (ऊपर देखें)टेक्स्टलेन: पूर्णांक;
शुरू

{पाठ की लंबाई प्राप्त करें}
TextLen: = GetWindowTextLength (hWND);
{alocate memory}

गेटम (pText, TextLen); // एक पॉइंटर लेता है
{नियंत्रण का पाठ प्राप्त करें}
GetWindowText (hWND, pText, TextLen + 1);
{पाठ प्रदर्शित करें}
ShowMessage (स्ट्रिंग (pText))
{स्मृति मुक्त करें}
FreeMem (pText);
समाप्त
;