सूचक (कंप्यूटर प्रोग्रामिंग): Difference between revisions

From Vigyanwiki
No edit summary
 
(9 intermediate revisions by 3 users not shown)
Line 4: Line 4:
{{quote box|quote=<nowiki>मैं कंप्यूटर विज्ञान के "सबसे कीमती  कोष" के बीच [˞[असाइनमेंट स्टेटमेंट और पॉइंटर वैरिएबल]] मानता हूं।</nowiki>|width=33%|source=[[डोनाल्ड नुथ]], ''संरचित प्रोग्रामिंग'', स्टेटमेंट्स पर जाएँ।<ref>{{cite journal|author=[[Donald Knuth]] |title=Structured Programming with go to Statements |journal=Computing Surveys |volume=6 |issue=5 |year=1974 |url=http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf |pages=261–301 |doi=10.1145/356635.356640 |url-status=dead |archive-url=https://web.archive.org/web/20090824073244/http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf |archive-date=August 24, 2009 |citeseerx=10.1.1.103.6084 |s2cid=207630080 }}</ref>}}
{{quote box|quote=<nowiki>मैं कंप्यूटर विज्ञान के "सबसे कीमती  कोष" के बीच [˞[असाइनमेंट स्टेटमेंट और पॉइंटर वैरिएबल]] मानता हूं।</nowiki>|width=33%|source=[[डोनाल्ड नुथ]], ''संरचित प्रोग्रामिंग'', स्टेटमेंट्स पर जाएँ।<ref>{{cite journal|author=[[Donald Knuth]] |title=Structured Programming with go to Statements |journal=Computing Surveys |volume=6 |issue=5 |year=1974 |url=http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf |pages=261–301 |doi=10.1145/356635.356640 |url-status=dead |archive-url=https://web.archive.org/web/20090824073244/http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf |archive-date=August 24, 2009 |citeseerx=10.1.1.103.6084 |s2cid=207630080 }}</ref>}}


[[File:Pointers.svg|thumb|पॉइंटर a वेरिएबल b से जुड़े मेमोरी एड्रेस की ओर संकेत करता है। इस आरेख में, कंप्यूटिंग संरचना समान [[पता स्थान|एड्रैस स्थान]] और औपचारिक विवरण दोनों पॉइंटर्स और गैर-पॉइंटर्स के लिए उपयोग करता है; यह जरूरत नहीं होनी चाहिए।]]कंप्यूटर विज्ञान में, कई प्रोग्रामिंग भाषाओं में एक पॉइंटर एक वस्तु है जो मेमोरी एड्रेस को संग्रहित करता है। यह कंप्यूटर मेमोरी में स्थित किसी अन्य मान का हो सकता है, या कुछ स्थितियों में, मेमोरी-मैप्ड कंप्यूटर हार्डवेयर का हो सकता है। एक पॉइंटर मेमोरी में एक स्थान का संदर्भ देता है, और उस स्थान पर संग्रहीत मान प्राप्त करना पॉइंटर को संदर्भित करने के रूप में जाना जाता है। सादृश्य के रूप में, किसी पुस्तक की अनुक्रमणिका में पेज संख्या को संबंधित पेज का पॉइंटर माना जा सकता है; इस तरह के पॉइंटर को डिफ्रेंसिंग दिए गए पेज संख्या के साथ पेज पर फ़्लिप करके और उस पेज पर मिले टेक्स्ट को पढ़कर किया जाएगा। पॉइंटर वेरिएबल (चर) का वास्तविक प्रारूप और सामग्री अंतर्निहित कंप्यूटर संरचना पर निर्भर है।
[[File:Pointers.svg|thumb|पॉइंटर a वेरिएबल b से जुड़े मेमोरी एड्रेस की ओर संकेत करता है। इस आरेख में, कंप्यूटिंग संरचना समान [[पता स्थान|एड्रैस स्थान]] और औपचारिक विवरण दोनों पॉइंटर्स और गैर-पॉइंटर्स के लिए उपयोग करता है; यह जरूरत नहीं होनी चाहिए।]]कंप्यूटर विज्ञान में, कई प्रोग्रामिंग भाषाओं में '''पॉइंटर''' एक वस्तु है जो मेमोरी एड्रेस को संग्रहित करता है। यह कंप्यूटर मेमोरी में स्थित किसी अन्य मान का हो सकता है, या कुछ स्थितियों में, मेमोरी-मैप्ड कंप्यूटर हार्डवेयर का हो सकता है। एक पॉइंटर मेमोरी में एक स्थान का संदर्भ देता है, और उस स्थान पर संग्रहीत मान प्राप्त करना पॉइंटर को संदर्भित करने के रूप में जाना जाता है। सादृश्य के रूप में, किसी पुस्तक की अनुक्रमणिका में पेज संख्या को संबंधित पेज का पॉइंटर माना जा सकता है; इस तरह के पॉइंटर को डिफ्रेंसिंग दिए गए पेज संख्या के साथ पेज पर फ़्लिप करके और उस पेज पर मिले टेक्स्ट को पढ़कर किया जाएगा। पॉइंटर वेरिएबल (चर) का वास्तविक प्रारूप और सामग्री अंतर्निहित कंप्यूटर संरचना पर निर्भर है।


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


पॉइंटर्स का उपयोग [[प्रक्रियात्मक प्रोग्रामिंग]] में सबरूटीन्स नामक [[सिस्टम कॉल]] लिए एंट्री पॉइंट्स के एड्रैस और गतिशील लिंक लाइब्रेरीज़ (डीएलएल) से रन-टाइम लिंकिंग के लिए भी किया जाता है। [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग|वस्तु-उन्मुख प्रोग्रामिंग]] में, [[फंक्शन पॉइंटर]] का उपयोग बाइंडिंग विधियों [[विधि (कंप्यूटर प्रोग्रामिंग)|(कंप्यूटर प्रोग्रामिंग)]] के लिए किया जाता है, प्रायः [[आभासी विधि तालिका|वर्चुअल विधि सारणी]] का उपयोग किया जाता है।
पॉइंटर्स का उपयोग [[प्रक्रियात्मक प्रोग्रामिंग]] में सबरूटीन्स नामक [[सिस्टम कॉल]] लिए एंट्री पॉइंट्स के एड्रैस और गतिशील लिंक लाइब्रेरीज़ (डीएलएल) से रन-टाइम लिंकिंग के लिए भी किया जाता है। [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग|वस्तु-उन्मुख प्रोग्रामिंग]] में, [[फंक्शन पॉइंटर]] का उपयोग बाइंडिंग विधियों [[विधि (कंप्यूटर प्रोग्रामिंग)|(कंप्यूटर प्रोग्रामिंग)]] के लिए किया जाता है, प्रायः [[आभासी विधि तालिका|वर्चुअल विधि सारणी]] का उपयोग किया जाता है।
Line 27: Line 27:
एक मेमोरी पॉइंटर (या सिर्फ पॉइंटर) एक प्रिमिटिव है, जिसका मान मेमोरी एड्रेस के रूप में उपयोग करने के लिए अभिप्रेत है; ऐसा कहा जाता है कि एक पॉइन्टर मेमोरी एड्रैस को इंगित करता है। यह भी कहा जाता है कि एक पॉइंटर डेटा [मेमोरी में] की ओर संकेत करता है जब पॉइंटर का मान डेटा का मेमोरी एड्रेस होता है।
एक मेमोरी पॉइंटर (या सिर्फ पॉइंटर) एक प्रिमिटिव है, जिसका मान मेमोरी एड्रेस के रूप में उपयोग करने के लिए अभिप्रेत है; ऐसा कहा जाता है कि एक पॉइन्टर मेमोरी एड्रैस को इंगित करता है। यह भी कहा जाता है कि एक पॉइंटर डेटा [मेमोरी में] की ओर संकेत करता है जब पॉइंटर का मान डेटा का मेमोरी एड्रेस होता है।


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


संदर्भ संकेत के स्तर के रूप में कार्य करते हैं: एक पॉइन्टर का मान निर्धारित करता है कि गणना में कौन सा मेमोरी एड्रैस (अर्थात, कौन सा डेटा) उपयोग किया जाना है। क्योंकि अप्रत्यक्ष एल्गोरिदम का एक मूलभूत स्वरूप है, पॉइंटर्स को प्रायः प्रोग्रामिंग भाषाओं में एक मौलिक डेटा प्रकार के रूप में व्यक्त किया जाता है; सांख्यिकीय रूप से (या दृढ़ता से) टाइप की गई प्रोग्रामिंग भाषाओं में, पॉइंटर का प्रकार उस डेटा के प्रकार को निर्धारित करता है जिस पर पॉइंटर इंगित करता है।
संदर्भ संकेत के स्तर के रूप में कार्य करते हैं: एक पॉइन्टर का मान निर्धारित करता है कि गणना में कौन सा मेमोरी एड्रैस (अर्थात, कौन सा डेटा) उपयोग किया जाना है। क्योंकि अप्रत्यक्ष एल्गोरिदम का एक मूलभूत स्वरूप है, पॉइंटर्स को प्रायः प्रोग्रामिंग भाषाओं में एक मौलिक डेटा प्रकार के रूप में व्यक्त किया जाता है; सांख्यिकीय रूप से (या दृढ़ता से) टाइप की गई प्रोग्रामिंग भाषाओं में, पॉइंटर का प्रकार उस डेटा के प्रकार को निर्धारित करता है जिस पर पॉइंटर इंगित करता है।
Line 41: Line 41:


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


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


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


पॉइंटर्स का उपयोग संदर्भ द्वारा पैरामीटर पास करने के लिए किया जाता है। यह उपयोगी है अगर प्रोग्रामर चाहता है कि फ़ंक्शन के कॉलर को फ़ंक्शन के पैरामीटर में संशोधन दिखाई दे। यह किसी फ़ंक्शन से एकाधिक मान वापस करने के लिए भी उपयोगी है।
पॉइंटर्स का उपयोग संदर्भ द्वारा पैरामीटर पास करने के लिए किया जाता है। यह उपयोगी है यदि प्रोग्रामर चाहता है कि फ़ंक्शन के कॉलर को फ़ंक्शन के पैरामीटर में संशोधन दिखाई दे। यह किसी फ़ंक्शन से एकाधिक मान वापस करने के लिए भी उपयोगी है।


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


=== सी पॉइंटर्स ===
=== C पॉइंटर्स ===
पॉइंटर को परिभाषित करने के लिए मूल [[सिंटेक्स (प्रोग्रामिंग भाषाएं)]] है:<ref>[[#c-std|ISO/IEC 9899]], clause 6.7.5.1, paragraph 1.</ref>
पॉइंटर को परिभाषित करने के लिए मूल [[सिंटेक्स (प्रोग्रामिंग भाषाएं)]] है:<ref>[[#c-std|ISO/IEC 9899]], clause 6.7.5.1, paragraph 1.</ref>
<syntaxhighlight lang= C>int *ptr;</syntaxhighlight>
<syntaxhighlight lang= C>int *ptr;</syntaxhighlight>


यह घोषित करता है <code>ptr</code> निम्न प्रकार की वस्तु के पहचानकर्ता के रूप में:
यह <code>ptr</code> को निम्न प्रकार की वस्तु के पहचानकर्ता के रूप में घोषित करता है:
* पॉइन्टर जो प्रकार की वस्तु को इंगित करता है <code>int</code>
* पॉइन्टर जो <code>int</code>प्रकार की वस्तु को इंगित करता है
यह सामान्य रूप से अधिक संक्षेप में कहा जाता है<code>ptr</code> का पॉइन्टर है <code>int</code>.
यह सामान्य रूप से अधिक संक्षेप में कहा जाता है क्योंकि <code>ptr</code> <code>int</code>का पॉइन्टर है


चूंकि सी भाषा स्वत: भंडारण अवधि की वस्तुओं के लिए एक अंतर्निहित प्रारंभिकरण निर्दिष्ट नहीं करती है,<ref>[[#c-std|ISO/IEC 9899]], clause 6.7.8, paragraph 10.</ref> यह सुनिश्चित करने के लिए प्रायः ध्यान रखा जाना चाहिए कि एड्रैस किसका है <code>ptr</code> अंक मान्य है; यही कारण है कि कभी-कभी यह सुझाव दिया जाता है कि एक पॉइन्टर को शून्य पॉइन्टर मान के लिए स्पष्ट रूप से प्रारंभ किया जाना चाहिए, जो परंपरागत रूप से मानकीकृत मैक्रो के साथ सी में निर्दिष्ट है <code>NULL</code>:<ref name="c-NULL">[[#c-std|ISO/IEC 9899]], clause 7.17, paragraph 3: ''NULL... which expands to an implementation-defined null pointer constant...''</ref>
चूंकि C भाषा स्वत: भंडारण अवधि की वस्तुओं के लिए एक अंतर्निहित प्रारंभिकरण निर्दिष्ट नहीं करती है,<ref>[[#c-std|ISO/IEC 9899]], clause 6.7.8, paragraph 10.</ref> प्रायः यह सुनिश्चित करने के लिए देखभाल की जानी चाहिए कि जिस एड्रैस पर <code>ptr</code> अंक मान्य है; यही कारण है कि कभी-कभी यह सुझाव दिया जाता है कि एक पॉइन्टर को शून्य पॉइन्टर मान के लिए स्पष्ट रूप से प्रारंभ किया जाना चाहिए, जो परंपरागत रूप से C मानकीकृत मैक्रो के साथ <code>NULL</code>के साथ निर्दिष्ट किया गया है:<ref name="c-NULL">[[#c-std|ISO/IEC 9899]], clause 7.17, paragraph 3: ''NULL... which expands to an implementation-defined null pointer constant...''</ref>
<syntaxhighlight lang= C>int *ptr = NULL;</syntaxhighlight>
<syntaxhighlight lang= C>int *ptr = NULL;</syntaxhighlight>


C में एक अशक्त पॉइन्टर को संदर्भित करना [[अपरिभाषित व्यवहार|अपरिभाषित गतिविधि]] उत्पन्न करता है,<ref>[[#c-std|ISO/IEC 9899]], clause 6.5.3.2, paragraph 4, footnote 87: ''If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined... Among the invalid values for dereferencing a pointer by the unary * operator are a null pointer...''</ref> जो विनाशकारी हो सकता है। हालाँकि, अधिकांश कार्यान्वयन{{citation needed|date=July 2011}} सामान्य रूप से सेगमेंटेशन गलती के साथ, प्रश्न में प्रोग्राम के निष्पादन को रोकें।
C में एक अशक्त पॉइन्टर को डिफ्रेंस करने से अपरिभाषित व्यवहार उत्पन्न होता है,<ref>[[#c-std|ISO/IEC 9899]], clause 6.5.3.2, paragraph 4, footnote 87: ''If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined... Among the invalid values for dereferencing a pointer by the unary * operator are a null pointer...''</ref> जो विनाशकारी हो सकता है। हालाँकि, अधिकांश कार्यान्वयन{{citation needed|date=July 2011}} सामान्य रूप से सेगमेंटेशन दोष के साथ, विचाराधीन प्रोग्राम के निष्पादन को रोकते है।


हालाँकि, पॉइंटर्स को आरंभ करना अनावश्यक रूप से प्रोग्राम विश्लेषण में बाधा डाल सकता है, जिससे बग छिप जाते हैं।
हालाँकि, पॉइंटर्स को आरंभ करना अनावश्यक रूप से प्रोग्राम विश्लेषण में प्रतिबाधित कर सकता है, जिससे बग छिप जाते हैं।


किसी भी स्थिति में, एक बार पॉइन्टर घोषित होने के बाद, अगला तार्किक कदम इसके लिए कुछ इंगित करना है:
किसी भी स्थिति में, एक बार पॉइन्टर घोषित होने के बाद, अगला तार्किक चरण इसके लिए कुछ इंगित करना है:
  int a = 5;
  int a = 5;
  int *ptr = NULL;
  int *ptr = NULL;
   
   
  ptr = &a;
  ptr = &a;
यह के एड्रैस का मान निर्दिष्ट करता है <code>a</code> को <code>ptr</code>. उदाहरण के लिए, अगर <code>a</code> 0x8130 के मेमोरी स्थान पर संग्रहीत किया जाता है, फिर का मान <code>ptr</code> असाइनमेंट के बाद 0x8130 होगा। पॉइंटर को डिरेफेरेंस करने के लिए, एक तारांकन चिह्न का फिर से उपयोग किया जाता है:
यह <code>a</code> को <code>ptr</code>के एड्रैस का मान निर्दिष्ट करता है उदाहरण के लिए, यदि <code>a</code> को 0x8130 के मेमोरी स्थान पर संग्रहीत किया जाता है, तो समनुदेशन के बाद <code>ptr</code> का मान 0x8130 होगा। पॉइंटर को डिरेफेरेंस करने के लिए, एक तारांकन (अस्ट्रिस्क) चिह्न का पुनः उपयोग किया जाता है:


<syntaxhighlight lang= C>*ptr = 8;</syntaxhighlight>
<syntaxhighlight lang= C>*ptr = 8;</syntaxhighlight>


इसका मतलब है की सामग्री लें <code>ptr</code> (जो 0x8130 है), उस एड्रैस को मेमोरी में ढूंढें और उसका मान 8 पर सेट करें।
इसका तात्पर्य है कि <code>ptr</code> (जो 0x8130 है) की सामग्री लें, उस एड्रैस को मेमोरी में जाँचे और उसका मान 8 पर स्थापित करें। यदि <code>a</code> बाद में पुनः अभिगम्य किया जाता है, इसका नया मान 8 होगा।
अगर <code>a</code> बाद में फिर से अभिगम्य किया जाता है, इसका नया मान 8 होगा।


यदि मेमोरी की सीधे जाँच की जाए तो यह उदाहरण अधिक स्पष्ट हो सकता है।
यदि मेमोरी की प्रत्यक्ष जाँच की जाए तो यह उदाहरण अधिक स्पष्ट हो सकता है। ये मान लीजिए <code>a</code> मेमोरी में एड्रैस 0x8130 पर स्थित है और <code>ptr</code> 0x8134 पर; यह भी मान लें कि यह 32-बिट मशीन है जैसे कि int 32-बिट चौड़ा है। निम्नलिखित कोड स्निपेट निष्पादित होने के बाद मेमोरी में क्या होगा:
ये मान लीजिए <code>a</code> मेमोरी में एड्रैस 0x8130 पर स्थित है और <code>ptr</code> 0x8134 पर; यह भी मान लें कि यह 32-बिट मशीन है जैसे कि int 32-बिट चौड़ा है। निम्नलिखित कोड स्निपेट निष्पादित होने के बाद मेमोरी में क्या होगा:
  int a = 5;
  int a = 5;
  int *ptr = NULL;
  int *ptr = NULL;
:{| class="wikitable"
:{| class="wikitable"
Address
एड्रैस
Contents
सामग्री
|-
|-
|  '''0x8130'''  
|  '''0x8130'''  
Line 92: Line 90:
|  0x00000000
|  0x00000000
|}
|}
(यहां दिखाया गया पूर्ण पॉइन्टर 0x00000000 है।)
(यहां दिखाया गया NULL पॉइंटर 0x00000000 है।) <code>a</code> को <code>ptr</code>का पता निर्दिष्ट करके:
का एड्रैस बता कर <code>a</code> को <code>ptr</code>:
   ptr = &a;
   ptr = &a;
</वाक्यविन्यास हाइलाइट>
 


निम्नलिखित मेमोरी मान उत्पन्न करता है:
निम्नलिखित मेमोरी मान उत्पन्न करता है:


:{| class="wikitable"
:{| class="wikitable"
! Address !! Contents
! एड्रैस !! सामग्री
|-
|-
| '''0x8130''' || 0x00000005
| '''0x8130''' || 0x00000005
Line 106: Line 103:
| '''0x8134''' || 0x00008130
| '''0x8134''' || 0x00008130
|}
|}
फिर dereferencing द्वारा <code>ptr</code> कोडिंग द्वारा:
फिर कोडिंग द्वारा <code>ptr</code> को डिफ्रेंसिंग करके:
  *ptr = 8;


<वाक्यविन्यास लैंग = सी>
*पीआरटी = 8;
</वाक्यविन्यास हाइलाइट>


कंप्यूटर की सामग्री ले जाएगा <code>ptr</code> (जो 0x8130 है), उस एड्रैस को 'ढूंढें', और उस स्थान पर 8 असाइन करें जो निम्नलिखित मेमोरी प्रदान करता है:
कंप्यूटर <code>ptr</code> (जो 0x8130 है), उस एड्रैस को 'जांच करे', और उस स्थान पर 8 निर्दिष्ट करें जो निम्नलिखित मेमोरी प्रदान करता है:


:{| class="wikitable"
:{| class="wikitable"
! Address !! Contents
! एड्रैस !! सामग्री
|-
|-
| '''0x8130''' || 0x00000008
| '''0x8130''' || 0x00000008
Line 121: Line 116:
| '''0x8134''' || 0x00008130
| '''0x8134''' || 0x00008130
|}
|}
स्पष्ट रूप से, पहुँचना <code>a</code> 8 का मान देगा क्योंकि पिछले निर्देश ने सामग्री को संशोधित किया था <code>a</code> पॉइन्टर के माध्यम से <code>ptr</code>.
स्पष्ट रूप से, <code>a</code> से तक अभिगम्य से 8 का मान निकलेगा क्योंकि पिछले निर्देश ने <code>a</code> पॉइन्टर के माध्यम से <code>ptr</code>की सामग्री को संशोधित किया था।


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


सापेक्ष एड्रैस [[आभासी मेमोरी]] सेगमेंटेशन का एक रूप हैं, और इसके कई फायदे और नुकसान साझा करते हैं। एक दो-बाइट ऑफ़सेट, जिसमें एक 16-बिट, अहस्ताक्षरित पूर्णांक होता है, का उपयोग 64 [[kibibytes]] तक सापेक्ष पता प्रदान करने के लिए किया जा सकता है (2<sup>16</sup> बाइट्स) एक डेटा संरचना की। इसे आसानी से 128, 256 या 512 KiB तक बढ़ाया जा सकता है यदि इंगित किए गए एड्रैस को आधे-शब्द, शब्द या दोहरे-शब्द सीमा पर [[डेटा संरचना संरेखण]] के लिए मजबूर किया जाता है (लेकिन, एक अतिरिक्त शिफ्ट बाएं [[बिटवाइज़ ऑपरेशन|बिटवाइज़ संचालन]] की आवश्यकता होती है - 1 तक, 2 या 3 बिट्स - ऑफसेट को 2, 4 या 8 के एक कारक द्वारा समायोजित करने के लिए, इसके अलावा आधार एड्रैस से पहले)। सामान्य रूप से , हालांकि, ऐसी योजनाएं बहुत परेशानी होती हैं, और प्रोग्रामर की सुविधा के लिए पूर्ण एड्रैस (और अंतर्निहित, एक फ्लैट एड्रैस स्थान) को प्राथमिकता दी जाती है।
सापेक्ष एड्रैस [[आभासी मेमोरी]] सेगमेंटेशन का एक रूप हैं, और इसके कई लाभ और दोष साझा करते हैं। एक दो-बाइट ऑफ़सेट, जिसमें एक 16-बिट, अहस्ताक्षरित पूर्णांक होता है, का उपयोग 64 किलोबाइट (2<sup>16</sup> बाइट्स) तक सापेक्ष एड्रैस प्रदान करने के लिए किया जा सकता है एक डेटा संरचना की। इसे आसानी से 128, 256 या 512 कीवीबाइट तक बढ़ाया जा सकता है यदि इंगित किए गए एड्रैस को आधे-शब्द, शब्द या दोहरे-शब्द सीमा पर [[डेटा संरचना संरेखण]] के लिए अनिवार्य किया जाता है (लेकिन, एक अतिरिक्त शिफ्ट बाएं [[बिटवाइज़ ऑपरेशन|बिटवाइज़ संचालन]] की आवश्यकता होती है - 1 तक, 2 या 3 बिट्स - ऑफसेट को 2, 4 या 8 के एक कारक द्वारा समायोजित करने के लिए, इसके अतिरिक्त बेस एड्रैस से पहले)। सामान्य रूप से, हालांकि, ऐसी योजनाएं बहुत संचारित होती हैं, और प्रोग्रामर की सुविधा के लिए पूर्ण एड्रैस (और अंतर्निहित, एक फ्लैट एड्रैस स्थान) को प्राथमिकता दी जाती है।


एक बाइट ऑफ़सेट, जैसे किसी वर्ण का हेक्साडेसिमल [[ASCII]] मान (उदा. X'29') का उपयोग किसी सरणी में वैकल्पिक पूर्णांक मान (या अनुक्रमणिका) को इंगित करने के लिए किया जा सकता है (उदा., X'01'). इस तरह, वर्णों को 'कच्चे डेटा' से प्रयोग करने योग्य अनुक्रमिक सरणी डेटा संरचना में और फिर लुकअप सारणी के बिना एक पूर्ण एड्रैस पर बहुत कुशलता से अनुवादित किया जा सकता है।
एक बाइट ऑफ़सेट, जैसे किसी वर्ण का हेक्साडेसिमल [[ASCII|सूचना विनिमय के लिए अमेरिकी मानक कोड]] मान (उदाहरण X'29') का उपयोग किसी सरणी में वैकल्पिक पूर्णांक मान (या अनुक्रमणिका) को इंगित करने के लिए किया जा सकता है (उदाहरण, X'01'). इस तरह, वर्णों को ' मूल एवं प्रारम्भिक तथ्य' से प्रयोग करने योग्य अनुक्रमिक सरणी डेटा संरचना में और फिर लुकअप सारणी के बिना एक पूर्ण एड्रैस पर बहुत कुशलता से अनुवादित किया जा सकता है।


== सी सरणियाँ ===
== C सरणियाँ==
सी में, पॉइन्टर अंकगणितीय के संदर्भ में सरणी अनुक्रमण औपचारिक रूप से परिभाषित किया गया है; अर्थात्, भाषा विनिर्देश के लिए इसकी आवश्यकता होती है <code>array[i]</code> के बराबर हो <code>*(array + i)</code>.<ref name="Plauger1992">{{cite book |title=ANSI and ISO Standard C Programmer's Reference |last=Plauger |first=P J |author-link=P. J. Plauger |author2=Brodie, Jim |year=1992 |publisher=Microsoft Press |location=Redmond, WA |isbn=978-1-55615-359-4 |pages=[https://archive.org/details/ansiisostandardc00plau/page/108 108, 51] |quote=An array type does not contain additional holes because all other types pack tightly when composed into arrays ''[at page 51]'' |url-access=registration |url=https://archive.org/details/ansiisostandardc00plau/page/108 }}</ref> इस प्रकार सी में, सरणियों को मेमोरी के लगातार क्षेत्रों के संकेत के रूप में माना जा सकता है (बिना अंतराल के),<ref name="Plauger1992" />और सरणियों तक पहुँचने के लिए सिंटैक्स उसके लिए समान है जिसका उपयोग पॉइंटर्स को हटाने के लिए किया जा सकता है। उदाहरण के लिए, एक सरणी <code>array</code> निम्नलिखित तरीके से घोषित और उपयोग किया जा सकता है:
C में, पॉइन्टर अंकगणितीय के संदर्भ में सरणी अनुक्रमण औपचारिक रूप से परिभाषित किया गया है; अर्थात्, भाषा विनिर्देश के लिए इसकी आवश्यकता है कि <code>array[i]</code> के <code>*(array + i)</code>समान हो।<ref name="Plauger1992">{{cite book |title=ANSI and ISO Standard C Programmer's Reference |last=Plauger |first=P J |author-link=P. J. Plauger |author2=Brodie, Jim |year=1992 |publisher=Microsoft Press |location=Redmond, WA |isbn=978-1-55615-359-4 |pages=[https://archive.org/details/ansiisostandardc00plau/page/108 108, 51] |quote=An array type does not contain additional holes because all other types pack tightly when composed into arrays ''[at page 51]'' |url-access=registration |url=https://archive.org/details/ansiisostandardc00plau/page/108 }}</ref> इस प्रकार C में, सरणियों को मेमोरी के निरंतर क्षेत्रों के संकेत के रूप में माना जा सकता है (बिना अंतराल के),<ref name="Plauger1992" />और सरणियों तक पहुँचने के लिए सिंटैक्स उसके लिए समान है जिसका उपयोग पॉइंटर्स को हटाने के लिए किया जा सकता है। उदाहरण के लिए, एक <code>array</code> निम्नलिखित तरीके से घोषित और उपयोग किया जा सकता है:
  int array[5];     /* Declares 5 contiguous integers */
  int array[5]; /* Declares 5 contiguous integers */
  int *ptr = array; /* Arrays can be used as pointers */
  int *ptr = array; /* Arrays can be used as pointers */
  ptr[0] = 1;       /* Pointers can be indexed with array syntax */
  ptr[0] = 1; /* Pointers can be indexed with array syntax */
  *(array + 1) = 2; /* Arrays can be dereferenced with pointer syntax */
  *(array + 1) = 2; /* Arrays can be dereferenced with pointer syntax */
  *(1 + array) = 2; /* Pointer addition is commutative */
  *(1 + array) = 2; /* Pointer addition is commutative */
  2[array] = 4;     /* Subscript operator is commutative */
  2[array] = 4; /* Subscript operator is commutative */
यह पाँच पूर्णांकों का एक ब्लॉक आवंटित करता है और ब्लॉक को नाम देता है <code>array</code>, जो ब्लॉक के लिए एक पॉइंटर के रूप में कार्य करता है। पॉइंटर्स का एक अन्य सामान्य उपयोग [[malloc]] से गतिशील रूप से आवंटित मेमोरी को इंगित करना है जो अनुरोधित आकार से कम की मेमोरी का लगातार ब्लॉक देता है जिसे एक सरणी के रूप में उपयोग किया जा सकता है।
यह पांच पूर्णांकों का एक ब्लॉक आवंटित करता है और ब्लॉक <code>array</code>को नाम देता है, जो ब्लॉक के लिए एक पॉइंटर के रूप में कार्य करता है। पॉइंटर्स का एक अन्य सामान्य उपयोग मॉलोक से गतिशील रूप से आवंटित मेमोरी को इंगित करना है जो अनुरोधित आकार से कम की मेमोरी का निरंतर ब्लॉक देता है जिसे एक सरणी के रूप में उपयोग किया जा सकता है।


जबकि सरणियों और पॉइंटर्स पर अधिकांश ऑपरेटर समतुल्य हैं, का परिणाम <code>[[Sizeof#Using sizeof with arrays|sizeof]]</code> ऑपरेटर अलग है। इस उदाहरण में, <code>sizeof(array)</code> का मूल्यांकन करेगा <code>5*sizeof(int)</code> (सरणी का आकार), जबकि <code>sizeof(ptr)</code> का मूल्यांकन करेगा <code>sizeof(int*)</code>, पॉइंटर का आकार।
जबकि सरणियों और पॉइंटर्स पर अधिकांश ऑपरेटर समतुल्य हैं, <code>[[Sizeof#Using sizeof with arrays|sizeof]]</code> ऑपरेटर का परिणाम भिन्न होता है। इस उदाहरण में, <code>sizeof(array)</code> <code>5*sizeof(int)</code> (सरणी का आकार) का मूल्यांकन करेगा, जबकि <code>sizeof(ptr)</code> पॉइंटर के आकार, <code>sizeof(int*)</code>का मूल्यांकन करेगा।


किसी सरणी के डिफ़ॉल्ट मानों को इस प्रकार घोषित किया जा सकता है:
किसी सरणी के डिफ़ॉल्ट मानों को इस प्रकार घोषित किया जा सकता है:
  int array[5] = {2, 4, 3, 1, 5};
  int array[5] = {2, 4, 3, 1, 5};
अगर <code>array</code> 32-बिट Endianness#Little-endian|little-endian मशीन पर एड्रैस 0x1000 से प्रारंभ होने वाली मेमोरी में स्थित है, तो मेमोरी में निम्न सम्मिलित होंगे (मान [[हेक्साडेसिमल]] में हैं, जैसे एड्रैस):
यदि <code>array</code> 32-बिट छोटी-एंडियन मशीन पर एड्रैस 0x1000 से प्रारंभ होने वाली मेमोरी में स्थित है, तो मेमोरी में निम्नलिखित सम्मिलित होंगे (मान हेक्साडेसिमल में हैं, जैसे एड्रैस):


:{| class="wikitable" style="font-family:monospace;"
:{| class="wikitable" style="font-family:monospace;"
Line 166: Line 161:
| 5 || 0 || 0 || 0
| 5 || 0 || 0 || 0
|}
|}
यहाँ प्रस्तुत पाँच पूर्णांक हैं: 2, 4, 3, 1, और 5। ये पाँच पूर्णांक 32 बिट्स (4 बाइट्स) पर कब्जा कर लेते हैं, जिनमें से प्रत्येक सबसे कम-महत्वपूर्ण बाइट पहले संग्रहीत होता है (यह एक छोटा-एंडियन [[सीपीयू आर्किटेक्चर|सीपीयू संरचना]] है) और लगातार संग्रहीत किया जाता है पता 0x1000 से प्रारंभ।
यहां प्रस्तुत पांच पूर्णांक 2, 4, 3, 1, और 5 हैं। ये पांच पूर्णांक 32 बिट्स (4 बाइट्स) पर प्रग्रहण कर लेते हैं, जिनमें से प्रत्येक सबसे कम-महत्वपूर्ण बाइट पहले संग्रहीत होता है (यह एक छोटा-एंडियन [[सीपीयू आर्किटेक्चर|सेंट्रल प्रोसेसिंग यूनिट संरचना]] है) और निरंतर संग्रहीत किया जाता है और एड्रैस 0x1000 से प्रारंभ है।


पॉइंटर्स के साथ C का सिंटैक्स है:
पॉइंटर्स के साथ C का सिंटैक्स है:
* <code>array</code> मतलब 0x1000;
* <code>array</code> तात्पर्य 0x1000;
* <code>array + 1</code> मतलब 0x1004: + 1 का मतलब 1 का आकार जोड़ना है <code>int</code>, जो 4 बाइट है;
* <code>array + 1</code> तात्पर्य 0x1004: + 1 का तात्पर्य <code>int</code>, के आकार को जोड़ना है, जो 4 बाइट्स है
* <code>*array</code> की सामग्री को डीरेफरेंस करने का मतलब है <code>array</code>. मेमोरी एड्रैस (0x1000) के रूप में सामग्री को ध्यान में रखते हुए, उस स्थान पर मान देखें (0x0002);
* <code>*array</code> का तात्पर्य है <code>array</code>की सामग्री को हटाना है। मेमोरी एड्रैस (0x1000) के रूप में सामग्री को ध्यान में रखते हुए, उस स्थान पर (0x0002) मान देखें;
* <code>array[i]</code> मतलब तत्व संख्या <code>i</code>, 0-आधारित, का <code>array</code> जिसका अनुवाद किया गया है <code>*(array + i)</code>.
* <code>array[i]</code> तात्पर्य तत्व संख्या <code>i</code>, 0-आधारित, <code>array</code> का है, जिसका अनुवाद <code>*(array + i) मे</code>किया गया है।


अंतिम उदाहरण यह है कि की सामग्री का उपयोग कैसे किया जाए <code>array</code>. इसे तोड़ना:
अंतिम उदाहरण यह है कि <code>array की सामग्री का उपयोग कैसे किया जाए</code>इसे तोड़ना:
* <code>array + i</code> (i) की मेमोरी लोकेशन है<sup>वें</sup> का तत्व <code>array</code>, i=0 से प्रारंभ;
* <code>array + i</code> (i) <sup>वें</sup> <code>array</code>की मेमोरी लोकेशन है i=0 से प्रारंभ होता है;
* <code>*(array + i)</code> उस मेमोरी एड्रेस को लेता है और वैल्यू को अभिगम्य करने के लिए इसे डीरेफर करता है।
* <code>*(array + i)</code> उस मेमोरी एड्रेस को लेता है और मान को अभिगम्य करने के लिए इसे संदर्भित करता है।


= सी लिंक की गई सूची ===
=== C से लिंक की गई सूची ===
नीचे C में लिंक की गई सूची की एक उदाहरण परिभाषा दी गई है।
नीचे C में लिंक की गई सूची की एक उदाहरण परिभाषा दी गई है।
  /* the empty linked list is represented by NULL
  /* the empty linked list is represented by NULL
   * or some other sentinel value */
   * or some other sentinel value */
  #define EMPTY_LIST NULL
  #define EMPTY_LIST NULL
   
   
  struct link {
  struct link {
    void       *data; /* data of this link */
  void *data; /* data of this link */
    struct link *next; /* next link; EMPTY_LIST if there is none */
  struct link *next; /* next link; EMPTY_LIST if there is none */
  };
  };
यह पॉइन्टर-पुनरावर्ती परिभाषा अनिवार्य रूप से [[हास्केल (प्रोग्रामिंग भाषा)]] से संदर्भ-पुनरावर्ती परिभाषा के समान है:
यह पॉइन्टर-पुनरावर्ती परिभाषा अनिवार्य रूप से [[हास्केल (प्रोग्रामिंग भाषा)]] से संदर्भ-पुनरावर्ती परिभाषा के समान है:
   data Link a = Nil
   data Link a = Nil
              | Cons a (Link a)
  | Cons a (Link a)
<code>Nil</code> खाली सूची है, और <code>Cons a (Link a)</code> विपक्ष प्रकार का सेल है <code>a</code> दूसरे लिंक के साथ भी प्रकार का <code>a</code>.
<code>Nil</code> रिक्त सूची है, और <code>Cons a (Link a)</code> टाइप <code>a</code> का एक कॉन्स सेल है जिसमें एक अन्य लिंक भी टाइप <code>a</code>का है।


हालाँकि, संदर्भों के साथ परिभाषा टाइप-चेक की गई है और संभावित रूप से भ्रमित करने वाले सिग्नल मानों का उपयोग नहीं करती है। इस कारण से, C में डेटा संरचनाओं को सामान्य रूप से [[आवरण समारोह]] के माध्यम से निपटाया जाता है, जिन्हें शुद्धता के लिए सावधानीपूर्वक जाँचा जाता है।
हालाँकि, संदर्भों के साथ परिभाषा टाइप-जांच की गई है और संभावित रूप से भ्रमित करने वाले सिग्नल मानों का उपयोग नहीं करती है। इस कारण से, C में डेटा संरचनाओं को सामान्य रूप से [[आवरण समारोह|रैपर फ़ंक्शन]] के माध्यम से विभाजित किया जाता है, जिन्हें शुद्धता के लिए सावधानीपूर्वक जाँचा जाता है।


=== ===पास-दर-एड्रैस संकेत === का उपयोग कर ===
=== पॉइंटर्स का उपयोग करके एड्रेस देना ===
पॉइंटर्स का उपयोग वेरिएबल्स को उनके एड्रैस से पास करने के लिए किया जा सकता है, जिससे उनका मान बदला जा सकता है। उदाहरण के लिए, निम्नलिखित [[सी (प्रोग्रामिंग भाषा)]] कोड पर विचार करें:
पॉइंटर्स का उपयोग वेरिएबल्स को उनके एड्रैस से पास करने के लिए किया जा सकता है, जिससे उनका मान बदला जा सकता है। उदाहरण के लिए, निम्नलिखित C [[सी (प्रोग्रामिंग भाषा)|(प्रोग्रामिंग भाषा)]] कोड पर विचार करें:
  /* a copy of the int n can be changed within the function without affecting the calling code */
  /* a copy of the int n can be changed within the function without affecting the calling code */
  void passByValue(int n) {
  void passByValue(int n) {
    n = 12;
  n = 12;
  }
  }
   
   
  /* a pointer m is passed instead. No copy of the value pointed to by m is created */
  /* a pointer m is passed instead. No copy of the value pointed to by m is created */
  void passByAddress(int *m) {
  void passByAddress(int *m) {
    *m = 14;
  *m = 14;
  }
  }
   
   
  int main(void) {
  int main(void) {
    int x = 3;
  int x = 3;
   
   
    /* pass a copy of x's value as the argument */
  /* pass a copy of x's value as the argument */
    passByValue(x);
  passByValue(x);
    // the value was changed inside the function, but x is still 3 from here on
  // the value was changed inside the function, but x is still 3 from here on
   
   
    /* pass x's address as the argument */
  /* pass x's address as the argument */
    passByAddress(&x);
  passByAddress(&x);
    // x was actually changed by the function and is now equal to 14 here
  // x was actually changed by the function and is now equal to 14 here
   
   
    return 0;
  return 0;
  }
  }


=== [[गतिशील स्मृति आवंटन|गतिशील मेमोरी आवंटन]] ===
=== [[गतिशील स्मृति आवंटन|गतिशील मेमोरी आवंटन]] ===
कुछ कार्यक्रमों में, आवश्यक मात्रा में मेमोरी इस बात पर निर्भर करती है कि उपयोगकर्ता क्या दर्ज कर सकता है। ऐसे स्थितियो में प्रोग्रामर को गतिशील रूप से मेमोरी आवंटित करने की आवश्यकता होती है। यह स्टैक के बजाय हीप पर मेमोरी आवंटित करके किया जाता है, जहां वेरिएबल सामान्य रूप से संग्रहीत होते हैं (वेरिएबल्स को सीपीयू रजिस्टरों में भी संग्रहीत किया जा सकता है, लेकिन यह एक और स्थिति है)। गतिशील मेमोरी आवंटन केवल पॉइंटर्स के माध्यम से किया जा सकता है, और नाम (जैसे सामान्य वेरिएबल के साथ) नहीं दिए जा सकते।
कुछ प्रोग्राम में, आवश्यक मात्रा में मेमोरी इस बात पर निर्भर करती है कि उपयोगकर्ता क्या प्रविष्ट कर सकता है। ऐसे स्थितियो में प्रोग्रामर को गतिशील रूप से मेमोरी आवंटित करने की आवश्यकता होती है। यह स्टैक के अतिरिक्त हीप पर मेमोरी आवंटित करके किया जाता है, जहां वेरिएबल सामान्य रूप से संग्रहीत होते हैं (वेरिएबल्स को सेंट्रल प्रोसेसिंग यूनिट रजिस्टरों में भी संग्रहीत किया जा सकता है, लेकिन यह एक और स्थिति है)। गतिशील मेमोरी आवंटन केवल पॉइंटर्स के माध्यम से किया जा सकता है, और नाम (जैसे सामान्य वेरिएबल के साथ) नहीं दिए जा सकते।


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


नीचे दिया गया उदाहरण C कोड दिखाता है कि कैसे संरचना वस्तुओं को गतिशील रूप से आवंटित और संदर्भित किया जाता है। मानक सी लाइब्रेरी फ़ंक्शन मॉलोक प्रदान करती है<code>malloc()</code>ढेर से मेमोरी ब्लॉक आवंटित करने के लिए। यह एक पैरामीटर के रूप में आवंटित करने के लिए एक वस्तु का आकार लेता है और ऑब्जेक्ट को संग्रहीत करने के लिए उपयुक्त मेमोरी के एक नए आवंटित ब्लॉक के लिए एक पॉइन्टर लौटाता है, या आवंटन विफल होने पर यह एक अशक्त पॉइन्टर लौटाता है।
नीचे दिया गया उदाहरण C कोड दिखाता है कि कैसे संरचना वस्तुओं को गतिशील रूप से आवंटित और संदर्भित किया जाता है। मानक C लाइब्रेरी फ़ंक्शन <code>malloc()</code>स्टैक से मेमोरी ब्लॉक आवंटित करने के लिए प्रदान करती है । यह एक पैरामीटर के रूप में आवंटित करने के लिए एक वस्तु का आकार लेता है और ऑब्जेक्ट को संग्रहीत करने के लिए उपयुक्त मेमोरी के एक नए आवंटित ब्लॉक के लिए एक पॉइन्टर देता है, या आवंटन विफल होने पर यह एक अशक्त पॉइन्टर देता है।
  /* Parts inventory item */
  /* Parts inventory item */
  struct Item {
  struct Item {
    int         id;     /* Part number */
  int id; /* Part number */
    char *     name;   /* Part name   */
  char * name; /* Part name */
    float       cost;   /* Cost       */
  float cost; /* Cost */
  };
  };
   
   
  /* Allocate and initialize a new Item object */
  /* Allocate and initialize a new Item object */
  struct Item * make_item(const char *name) {
  struct Item * make_item(const char *name) {
    struct Item * item;
  struct Item * item;
   
   
    /* Allocate a block of memory for a new Item object */
  /* Allocate a block of memory for a new Item object */
    item = malloc(sizeof(struct Item));
  item = malloc(sizeof(struct Item));
    if (item == NULL)
  if (item == NULL)
        return NULL;
  return NULL;
   
   
    /* Initialize the members of the new Item */
  /* Initialize the members of the new Item */
    memset(item, 0, sizeof(struct Item));
  memset(item, 0, sizeof(struct Item));
    item->id =   -1;
  item->id = -1;
    item->name = NULL;
  item->name = NULL;
    item->cost = 0.0;
  item->cost = 0.0;
   
   
    /* Save a copy of the name in the new Item */
  /* Save a copy of the name in the new Item */
    item->name = malloc(strlen(name) + 1);
  item->name = malloc(strlen(name) + 1);
    if (item->name == NULL) {
  if (item->name == NULL) {
        free(item);
  free(item);
        return NULL;
  return NULL;
    }
  }
    strcpy(item->name, name);
  strcpy(item->name, name);
   
   
    /* Return the newly created Item object */
  /* Return the newly created Item object */
    return item;
  return item;
  }
  }
नीचे दिया गया कोड बताता है कि मेमोरी ऑब्जेक्ट्स को गतिशील रूप से कैसे हटाया जाता है, अर्थात ढेर या मुफ्त संग्रहित में लौटाया जाता है। मानक सी लाइब्रेरी मुफ्त () | फ़ंक्शन प्रदान करती है<code>free()</code>पहले आवंटित मेमोरी ब्लॉक को हटाने और इसे वापस ढेर पर वापस करने के लिए।
नीचे दिया गया कोड बताता है कि मेमोरी ऑब्जेक्ट्स को गतिशील रूप से कैसे हटाया जाता है, अर्थात स्टैक या मुफ्त संग्रहित में वापस किया जाता है। मानक C लाइब्रेरी <code>free()</code>पहले आवंटित मेमोरी ब्लॉक को हटाने और इसे वापस स्टैक पर वापस करने के लिए प्रदान करती है।
  /* Deallocate an Item object */
  /* Deallocate an Item object */
  void destroy_item(struct Item *item) {
  void destroy_item(struct Item *item) {
    /* Check for a null object pointer */
  /* Check for a null object pointer */
    if (item == NULL)
  if (item == NULL)
        return;
  return;
   
   
    /* Deallocate the name string saved within the Item */
  /* Deallocate the name string saved within the Item */
    if (item->name != NULL) {
  if (item->namem!= NULL) {
        free(item->name);
  free(item->name);
        item->name = NULL;
  item->name = NULL;
    }
  }
   
   
    /* Deallocate the Item object itself */
  /* Deallocate the Item object itself */
    free(item);
  free(item);
  }
  }
=== मेमोरी-मैप्ड हार्डवेयर ===
=== मेमोरी-मैप किया गया हार्डवेयर ===
कुछ कंप्यूटिंग संरचना पर, पॉइंटर्स का उपयोग सीधे मेमोरी या मेमोरी-मैप्ड डिवाइसेस में कुशलतापूर्वक प्रयोग करने के लिए किया जा सकता है।
कुछ कंप्यूटिंग संरचना पर, पॉइंटर्स का उपयोग प्रत्यक्ष रूप से मेमोरी या मेमोरी-मैप्ड डिवाइसेस में कुशलतापूर्वक प्रयोग करने के लिए किया जा सकता है।


[[microcontroller]]्स की प्रोग्रामिंग करते समय पॉइंटर्स को एड्रेस असाइन करना एक अमूल्य उपकरण है। नीचे एक सामान्य उदाहरण है जो एक प्रकार के int के पॉइन्टर को घोषित करता है और इसे हेक्साडेसिमल एड्रैस पर प्रारंभ करता है, इस उदाहरण में निरंतर 0x7FFF:
माइक्रोकंट्रोलर्स की प्रोग्रामिंग करते समय पॉइंटर्स को एड्रेस निर्दिष्ट करना एक अमूल्य उपकरण है। नीचे एक सामान्य उदाहरण है जो एक प्रकार के int के पॉइन्टर को घोषित करता है और इसे हेक्साडेसिमल एड्रैस पर प्रारंभ करता है, इस उदाहरण में निरंतर 0x7FFF:
  int *hardware_address = (int *)0x7FFF;
  int *hardware_address = (int *)0x7FFF;
80 के दशक के मध्य में, पीसी की वीडियो क्षमताओं तक पहुँचने के लिए [[BIOS]] का उपयोग धीमा था। प्रदर्शन-गहन अनुप्रयोग सामान्य रूप से हेक्साडेसिमल स्थिरांक 0xB8000 को 80 अहस्ताक्षरित 16-बिट int मानों की एक सरणी के लिए पॉइंटर में कास्ट करके सीधे [[रंग ग्राफिक्स एडेप्टर]] वीडियो मेमोरी तक पहुंचने के लिए उपयोग किया जाता है। प्रत्येक मान में निम्न बाइट में एक ASCII कोड और उच्च बाइट में एक रंग सम्मिलित होता है। इस प्रकार, अक्षर 'A' को पंक्ति 5 में, कॉलम 2 को नीले रंग पर चमकीले सफेद रंग में रखने के लिए, निम्नलिखित कोड की तरह लिखा जाएगा:
80 के दशक के मध्य में, पर्सनल कंप्यूटर की वीडियो क्षमताओं तक पहुँचने के लिएबेसिक इनपुट/आउटपुट सिस्टम का उपयोग मंद था। प्रदर्शन-गहन अनुप्रयोग सामान्य रूप से हेक्साडेसिमल स्थिर 0xB8000 को 80 अहस्ताक्षरित 16-बिट int मानों की एक सरणी के लिए पॉइंटर में निर्धारित करके प्रत्यक्ष रूप से [[रंग ग्राफिक्स एडेप्टर]] वीडियो मेमोरी तक पहुंचने के लिए उपयोग किया जाता है। प्रत्येक मान में निम्न बाइट में एक सूचना विनिमय के लिए अमेरिकी मानक कोड और उच्च बाइट में एक रंग सम्मिलित होता है। इस प्रकार, अक्षर 'A' को पंक्ति 5 में, कॉलम 2 को नीले रंग पर चमकीले सफेद रंग में रखने के लिए, निम्नलिखित कोड की तरह लिखा जाएगा:
  #define VID ((unsigned short (*)[80])0xB8000)
  #define VID ((unsigned short (*)[80])0xB8000)
   
   
  void foo(void) {
  void foo(void) {
    VID[4][1] = 0x1F00 | 'A';
  VID[4][1] = 0x1F00 | 'A';
  }
  }


=== नियंत्रण तालिकाओं में प्रयोग करें ===
=== नियंत्रण तालिकाओं में प्रयोग करें ===
{{see also|#Function pointer|#Wild branch}}
{{see also|§ फंक्शन पॉइंटर, और § वाइल्ड ब्रांच}}
प्रोग्राम प्रवाह को नियंत्रित करने के लिए उपयोग की जाने वाली नियंत्रण तालिकाएं सामान्य रूप से  पॉइंटर्स का व्यापक उपयोग करती हैं। पॉइंटर्स, सामान्य रूप से  सारणी  एंट्री में एम्बेडेड होते हैं, उदाहरण के लिए, उसी सारणी  एंट्री में परिभाषित कुछ शर्तों के आधार पर [[सबरूटीन]]्स को एंट्री पॉइंट्स को निष्पादित करने के लिए उपयोग किया जा सकता है। हालाँकि पॉइंटर्स केवल अन्य अलग-अलग, लेकिन संबंधित तालिकाओं के लिए अनुक्रमित हो सकते हैं, जिसमें वास्तविक एड्रैस की एक सरणी होती है या खुद एड्रैस होते हैं (प्रोग्रामिंग भाषा के उपलब्ध निर्माण के आधार पर)। उनका उपयोग पहले की सारणी प्रविष्टियों (लूप प्रोसेसिंग में) को इंगित करने के लिए या कुछ सारणी प्रविष्टियों को छोड़ने के लिए आगे बढ़ने के लिए भी किया जा सकता है (जैसे कि [[स्विच स्टेटमेंट]] में या लूप से जल्दी बाहर निकलना)। इस बाद के उद्देश्य के लिए, पॉइन्टर केवल सारणी प्रविष्टि संख्या ही हो सकता है और साधारण अंकगणितीय द्वारा वास्तविक एड्रैस में परिवर्तित किया जा सकता है।


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


उदाहरण के लिए, सी में
उदाहरण के लिए, C में
  int *money;
  int *money;
  char *bags;
  char *bags;
<code>money</code> एक पूर्णांक पॉइन्टर होगा और <code>bags</code> एक चार पॉइन्टर होगा।
<code>money</code> एक पूर्णांक पॉइन्टर होगा और <code>bags</code> एक चार पॉइन्टर होगा। निम्नलिखित जीएनयू कंपाइलर संग्रह के अंतर्गत असंगत पॉइन्टर प्रकार से समनुदेशन की एक कंपाइलर चेतावनी उत्पन्न करेगा
निम्नलिखित जीएनयू कंपाइलर संग्रह के तहत असंगत पॉइन्टर प्रकार से असाइनमेंट की एक कंपाइलर चेतावनी उत्पन्न करेगा
  bags = money;
  bags = money;
क्योंकि <code>money</code> और <code>bags</code> विभिन्न प्रकारों के साथ घोषित किए गए थे।
क्योंकि <code>money</code> और <code>bags</code> विभिन्न प्रकारों के साथ घोषित किए गए थे। कंपाइलर चेतावनी को दबाने के लिए, यह स्पष्ट किया जाना चाहिए कि आप वास्तव में टाइप रूपांतरण द्वारा समनुदेशन करना चाहते हैं
कंपाइलर चेतावनी को दबाने के लिए, यह स्पष्ट किया जाना चाहिए कि आप वास्तव में टाइप रूपांतरण द्वारा असाइनमेंट करना चाहते हैं
  bags = (char *)money;
  bags = (char *)money;
जो पूर्णांक पॉइन्टर को कास्ट करने के लिए कहता है <code>money</code> एक चार पॉइन्टर को और असाइन करें <code>bags</code>.
जो पूर्णांक पॉइन्टर को <code>money</code> निर्दिष्ट करने और <code>bags</code>को निर्दिष्ट करने के लिए कहता है।


सी मानक के 2005 के एक मसौदे के लिए आवश्यक है कि एक प्रकार से दूसरे प्रकार से प्राप्त पॉइन्टर को कास्टिंग करने से दोनों प्रकारों के लिए संरेखण शुद्धता बनाए रखनी चाहिए (6.3.2.3 पॉइंटर्स, पैरा। 7):<ref>[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf WG14 N1124], [http://www.open-std.org/jtc1/sc22/wg14/www/standards.html C – Approved standards: ISO/IEC 9899 – Programming languages – C], 2005-05-06.</ref>
C मानक के 2005 के एक प्रारूप के लिए आवश्यक है कि एक प्रकार से दूसरे प्रकार से प्राप्त पॉइन्टर को कास्टिंग करने से दोनों प्रकारों के लिए संरेखण शुद्धता बनाए रखनी चाहिए (6.3.2.3 पॉइंटर्स, पैरा। 7):<ref>[http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf WG14 N1124], [http://www.open-std.org/jtc1/sc22/wg14/www/standards.html C – Approved standards: ISO/IEC 9899 – Programming languages – C], 2005-05-06.</ref>  
<वाक्यविन्यास लैंग =
  char *external_buffer = "abcdef";
  char *external_buffer = "abcdef";
  int *internal_data;
  int *internal_data;
   
   
  internal_data = (int *)external_buffer; // UNDEFINED BEHAVIOUR if "the resulting pointer
  internal_data = (int *)external_buffer; // UNDEFINED BEHAVIOUR if "the resulting pointer
                                           // is not correctly aligned"
                                           // is not correctly aligned"
उन भाषाओं में जो पॉइंटर अंकगणित की स्वीकृति देती हैं, पॉइंटर्स पर अंकगणित प्रकार के आकार को ध्यान में रखता है। उदाहरण के लिए, एक पॉइंटर में एक पूर्णांक संख्या जोड़ने से एक और पॉइंटर उत्पन्न होता है जो उस एड्रैस की ओर संकेत करता है जो उस संख्या के प्रकार के आकार से अधिक होता है। यह हमें किसी दिए गए प्रकार की सरणी के तत्वों के एड्रैस की आसानी से गणना करने की स्वीकृति देता है, जैसा ऊपर सी सरणी उदाहरण में दिखाया गया था। जब एक प्रकार के पॉइंटर को दूसरे प्रकार के भिन्न आकार में डाला जाता है, तो प्रोग्रामर को यह उम्मीद करनी चाहिए कि पॉइंटर अंकगणित की अलग-अलग गणना की जाएगी। सी में, उदाहरण के लिए, यदि <code>money</code> सरणी 0x2000 से प्रारंभ होती है और <code>sizeof(int)</code> 4 बाइट है जबकि <code>sizeof(char)</code> 1 बाइट है, तो <code>money + 1</code> 0x2004 को इंगित करेगा, लेकिन <code>bags + 1</code> 0x2001 को इंगित करेगा। कास्टिंग के अन्य जोखिमों में डेटा की हानि सम्मिलित है जब विस्तृत डेटा संकीर्ण स्थानों पर लिखा जाता है (उदा। <code>bags[0] = 65537;</code>), अनपेक्षित परिणाम जब [[बिट शिफ्ट]] | बिट-शिफ्टिंग मान, और तुलना समस्याएं, विशेष रूप से हस्ताक्षरित बनाम अहस्ताक्षरित मूल्यों के साथ।
उन भाषाओं में जो पॉइंटर अंकगणित की स्वीकृति देती हैं, पॉइंटर्स पर अंकगणित प्रकार के आकार को ध्यान में रखता है। उदाहरण के लिए, एक पॉइंटर में एक पूर्णांक संख्या जोड़ने से एक और पॉइंटर उत्पन्न होता है जो उस एड्रैस की ओर संकेत करता है जो उस संख्या के प्रकार के आकार से अधिक होता है। यह हमें किसी दिए गए प्रकार की सरणी के तत्वों के एड्रैस की आसानी से गणना करने की स्वीकृति देता है, जैसा ऊपर C सरणी उदाहरण में दिखाया गया था। जब एक प्रकार के पॉइंटर को दूसरे प्रकार के भिन्न आकार में निर्दिष्ट किया जाता है, तो प्रोग्रामर को यह उपेक्षा करनी चाहिए कि पॉइंटर अंकगणित की अलग-अलग गणना की जाएगी। C में, उदाहरण के लिए, यदि <code>money</code> सरणी 0x2000 से प्रारंभ होती है और <code>sizeof(int)</code> 4 बाइट है जबकि <code>sizeof(char)</code> 1 बाइट है, तो <code>money + 1</code> 0x2004 को इंगित करेगा, लेकिन <code>bags + 1</code> 0x2001 को इंगित करेगा। कास्टिंग के अन्य जोखिमों में डेटा की हानि सम्मिलित है जब विस्तृत डेटा संकीर्ण स्थानों पर लिखा जाता है (उदाहरण <code>bags[0] = 65537;</code>), अनपेक्षित परिणाम जब बिट-शिफ्टिंग मान, और तुलना समस्याएं, विशेष रूप से हस्ताक्षरित बनाम अहस्ताक्षरित मूल्यों के साथ होती है।


हालांकि संकलन-समय पर सामान्य रूप से यह निर्धारित करना असंभव है कि कौन सी कास्ट सुरक्षित है, कुछ भाषाएँ [[रन-टाइम प्रकार की जानकारी]] संग्रहीत करती हैं जिनका उपयोग यह पुष्टि करने के लिए किया जा सकता है कि ये खतरनाक कास्ट रनटाइम पर मान्य हैं। अन्य भाषाएँ केवल सुरक्षित जातियों के एक रूढ़िवादी सन्निकटन को स्वीकार करती हैं, या कोई भी नहीं।
हालांकि संकलन-समय पर सामान्य रूप से यह निर्धारित करना असंभव है कि कौन C कास्ट सुरक्षित है, कुछ भाषाएँ [[रन-टाइम प्रकार की जानकारी]] संग्रहीत करती हैं जिनका उपयोग यह पुष्टि करने के लिए किया जा सकता है कि ये जोखिमयुक्त कास्ट रनटाइम पर मान्य हैं। अन्य भाषाएँ केवल सुरक्षित कास्ट के एक संरक्षी अनुमान को स्वीकार करती हैं, या कोई भी नहीं।


=== पॉइंटर्स का मूल्य ===
=== पॉइंटर्स का मूल्य ===
सी और सी ++ में, तथापि दो पॉइंटर्स बराबर के रूप में तुलना करें, इसका मतलब यह नहीं है कि वे समकक्ष हैं। इन भाषाओं और [[एलएलवीएम]] में, नियम की व्याख्या इस अर्थ में की जाती है कि सिर्फ इसलिए कि दो पॉइंटर्स एक ही एड्रैस की ओर संकेत करते हैं, इसका मतलब यह नहीं है कि वे इस अर्थ में समान हैं कि उन्हें एक दूसरे के स्थान पर उपयोग किया जा सकता है, पॉइंटर्स के बीच के अंतर को उनके उद्गम के रूप में संदर्भित किया जाता है।<ref>{{cite web |last1=Jung |first1=Ralf |title=Pointers Are Complicated II, or: We need better language specs |url=https://www.ralfj.de/blog/2020/12/14/provenance.html}}</ref> एक पूर्णांक प्रकार जैसे कि कास्टिंग करना <code>uintptr_t</code> कार्यान्वयन-परिभाषित है और यह जो तुलना प्रदान करता है वह इस बारे में अधिक जानकारी प्रदान नहीं करता है कि क्या दो पॉइंटर्स विनिमेय हैं। इसके अलावा, बाइट्स और अंकगणित में आगे रूपांतरण पॉइंटर्स के उपयोग को ट्रैक करने की कोशिश कर रहे ऑप्टिमाइज़र को फेंक देगा, एक समस्या अभी भी अकादमिक शोध में स्पष्ट है।<ref>{{cite web |title=Pointers Are Complicated, or: What's in a Byte? |url=https://www.ralfj.de/blog/2018/07/24/pointers-and-bytes.html |last1=Jung|first1=Ralf}}</ref>
C और C ++ में, तथापि दो पॉइंटर्स समान के रूप में तुलना करें, इसका तात्पर्य यह नहीं है कि वे समकक्ष हैं। इन भाषाओं और [[एलएलवीएम]] में, नियम की व्याख्या इस अर्थ में की जाती है कि सिर्फ इसलिए कि दो पॉइंटर्स एक ही एड्रैस की ओर संकेत करते हैं, इसका तात्पर्य यह नहीं है कि वे इस अर्थ में समान हैं कि उन्हें एक दूसरे के स्थान पर उपयोग किया जा सकता है, पॉइंटर्स के बीच के अंतर को उनके उद्गम के रूप में संदर्भित किया जाता है।<ref>{{cite web |last1=Jung |first1=Ralf |title=Pointers Are Complicated II, or: We need better language specs |url=https://www.ralfj.de/blog/2020/12/14/provenance.html}}</ref> एक पूर्णांक प्रकार जैसे कि कास्टिंग करना <code>uintptr_t</code> कार्यान्वयन-परिभाषित है और यह जो तुलना प्रदान करता है वह इस बारे में अधिक जानकारी प्रदान नहीं करता है कि क्या दो पॉइंटर्स विनिमेय हैं। इसके अतिरिक्त, बाइट्स और अंकगणित में आगे रूपांतरण पॉइंटर्स के उपयोग को ट्रैक करने की प्रयास कर रहे ऑप्टिमाइज़र को मुक्त कर देगा, एक समस्या अभी भी अकादमिक शोध में स्पष्ट है।<ref>{{cite web |title=Pointers Are Complicated, or: What's in a Byte? |url=https://www.ralfj.de/blog/2018/07/24/pointers-and-bytes.html |last1=Jung|first1=Ralf}}</ref>




== पॉइंटर्स को सुरक्षित बनाना ==
== पॉइंटर्स को सुरक्षित बनाना ==
एक पॉइन्टर के रूप में एक प्रोग्राम को एक ऐसी वस्तु तक पहुँचने का प्रयास करने की स्वीकृति देता है जिसे परिभाषित नहीं किया जा सकता है, संकेत विभिन्न प्रकार के [[सॉफ्टवेयर बग]] की उत्पत्ति हो सकते हैं। हालाँकि, पॉइंटर्स की उपयोगिता इतनी अधिक है कि उनके बिना प्रोग्रामिंग कार्यों को करना मुश्किल हो सकता है। नतीजतन, कई भाषाओं ने अपने कुछ एंटी-पैटर्न के बिना पॉइंटर्स की कुछ उपयोगी विशेषताओं को प्रदान करने के लिए डिज़ाइन किए गए निर्माणों का निर्माण किया है, जिन्हें कभी-कभी पॉइंटर खतरों के रूप में भी जाना जाता है। इस संदर्भ में, पॉइंटर्स जो सीधे मेमोरी को संबोधित करते हैं (जैसा कि इस आलेख में उपयोग किया गया है) को 'के रूप में संदर्भित किया जाता है।{{visible anchor|raw pointer}}s, [[स्मार्ट सूचक]]्स या अन्य वेरिएंट के विपरीत।
एक पॉइन्टर के रूप में एक प्रोग्राम को एक ऐसी वस्तु तक पहुँचने का प्रयास करने की स्वीकृति देता है जिसे परिभाषित नहीं किया जा सकता है, संकेत विभिन्न प्रकार के [[सॉफ्टवेयर बग]] की उत्पत्ति हो सकते हैं। हालाँकि, पॉइंटर्स की उपयोगिता इतनी अधिक है कि उनके बिना प्रोग्रामिंग त्रुटियों का मूल हो सकते हैं। परिणामस्वरूप, कई भाषाओं ने अपने कुछ नुकसान के बिना पॉइंटर्स की कुछ उपयोगी विशेषताओं को प्रदान करने के लिए डिज़ाइन किए गए निर्माणों का निर्माण किया है, जिन्हें कभी-कभी पॉइंटर जोखिमों के रूप में भी जाना जाता है। इस संदर्भ में, पॉइंटर्स जो प्रत्यक्ष रूप से मेमोरी को संबोधित करते हैं (जैसा कि इस आलेख में उपयोग किया गया है) और स्मार्ट पॉइंटर्स या अन्य वेरिएंट के विपरीत अपरिष्कृत पॉइंटर्स के रूप में संदर्भित किया जाता है।


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


एक पॉइंटर जिसका कोई एड्रैस नहीं होता है, उसे [[जंगली सूचक|जंगली पॉइन्टर]] कहा जाता है। इस तरह के गैर-प्रारंभिकृत पॉइंटर्स का उपयोग करने का कोई भी प्रयास अप्रत्याशित गतिविधि का कारण बन सकता है, या तो प्रारंभिक मान एक वैध एड्रैस नहीं है, या इसका उपयोग करने से प्रोग्राम के अन्य भागों को नुकसान हो सकता है। नतीजा प्रायः एक सेगमेंटेशन गलती, भंडारण उल्लंघन या [[जंगली शाखा|जंगली ब्रांच]] होती है (यदि फ़ंक्शन पॉइंटर या ब्रांच एड्रैस के रूप में उपयोग किया जाता है)।
एक पॉइंटर जिसका कोई एड्रैस नहीं होता है, उसे [[जंगली सूचक|वाइल्ड पॉइन्टर]] कहा जाता है। इस तरह के गैर-प्रारंभिकृत पॉइंटर्स का उपयोग करने का कोई भी प्रयास अप्रत्याशित गतिविधि का कारण बन सकता है, या तो प्रारंभिक मान एक वैध एड्रैस नहीं है, या इसका उपयोग करने से प्रोग्राम के अन्य भागों को नुकसान हो सकता है। परिणाम प्रायः एक सेगमेंटेशन दोष, भंडारण उल्लंघन या [[जंगली शाखा|वाइल्ड ब्रांच]] होती है (यदि फ़ंक्शन पॉइंटर या ब्रांच एड्रैस के रूप में उपयोग किया जाता है)।


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


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


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


=== मूल्य द्वारा परिभाषित प्रकार ===
=== मूल्य द्वारा परिभाषित प्रकार ===


==== अशक्त पॉइन्टर ====
==== अशक्त पॉइन्टर ====
{{Main|Null pointer}}
{{Main|अशक्त पॉइन्टर}}
एक अशक्त पॉइन्टर का एक मान आरक्षित होता है जो इंगित करता है कि पॉइन्टर एक वैध वस्तु का संदर्भ नहीं देता है। अशक्त पॉइंटर नियमित रूप से अज्ञात लंबाई की सूची (कंप्यूटिंग) के अंत या कुछ कार्रवाई करने में विफलता जैसी स्थितियों का प्रतिनिधित्व करने के लिए उपयोग किए जाते हैं; नल पॉइंटर्स के इस उपयोग की तुलना [[अशक्त प्रकार]]ों और एक [[विकल्प प्रकार]] में ''कुछ नहीं'' मान से की जा सकती है।


==== झूलने वाला पॉइन्टर ====
एक अशक्त पॉइन्टर का एक मान आरक्षित होता है जो इंगित करता है कि पॉइन्टर एक वैध वस्तु का संदर्भ नहीं देता है। अशक्त पॉइंटर नियमित रूप से अज्ञात लंबाई की सूची (कंप्यूटिंग) के अंत या कुछ प्रतिक्रिया करने में विफलता जैसी स्थितियों का प्रतिनिधित्व करने के लिए उपयोग किए जाते हैं; अस्थिर पॉइंटर्स के इस उपयोग की तुलना अशक्त प्रकारों और विकल्प प्रकार में कुछ भी नहीं मान से की जा सकती है।
{{Main|Dangling pointer}}
डैंगलिंग पॉइंटर एक पॉइंटर होता है जो किसी वैध वस्तु की ओर संकेत नहीं करता है और इसके परिणामस्वरूप प्रोग्राम क्रैश हो सकता है या अजीब गतिविधि कर सकता है। [[पास्कल (प्रोग्रामिंग भाषा)]] या सी (प्रोग्रामिंग भाषा) में, पॉइंटर्स जो विशेष रूप से इनिशियलाइज़ नहीं होते हैं, वे मेमोरी में अप्रत्याशित एड्रैस की ओर संकेत कर सकते हैं।


निम्न उदाहरण कोड झूलने वाले पॉइन्टर को दिखाता है:
==== डांगलिंग पॉइन्टर ====
{{Main|डांगलिंग पॉइन्टर}}
 
डैंगलिंग पॉइंटर एक पॉइंटर होता है जो किसी वैध वस्तु की ओर संकेत नहीं करता है और इसके परिणामस्वरूप प्रोग्राम क्रैश हो सकता है या अद्वितीय गतिविधि कर सकता है। [[पास्कल (प्रोग्रामिंग भाषा)]] या C (प्रोग्रामिंग भाषा) में, पॉइंटर्स जो विशेष रूप से आरंभीकृत नहीं होते हैं, वे मेमोरी में अप्रत्याशित एड्रैस की ओर संकेत कर सकते हैं।
 
निम्न उदाहरण कोड डांगलिंग पॉइन्टर को दिखाता है:
  int func(void) {
  int func(void) {
    char *p1 = malloc(sizeof(char)); /* (undefined) value of some place on the heap */
  char *p1 = malloc(sizeof(char)); /* (undefined) value of some place on the heap */
    char *p2;       /* dangling (uninitialized) pointer */
  char *p2; /* dangling (uninitialized) pointer */
    *p1 = 'a';     /* This is OK, assuming malloc() has not returned NULL. */
  *p1 = 'a'; /* This is OK, assuming malloc() has not returned NULL. */
    *p2 = 'b';     /* This invokes undefined behavior */
  *p2 = 'b'; /* This invokes undefined behavior */
  }
  }
यहाँ, <code>p2</code> मेमोरी में कहीं भी इंगित कर सकता है, इसलिए असाइनमेंट कर रहा है <code>*p2 = 'b';</code> मेमोरी के अज्ञात क्षेत्र को दूषित कर सकता है या विभाजन दोष को ट्रिगर कर सकता है।
यहाँ, <code>p2</code> मेमोरी में कहीं भी इंगित कर सकता है, इसलिए समनुदेशन <code>*p2 = 'b';</code> कर रहा है, मेमोरी के अज्ञात क्षेत्र को नष्ट कर सकता है या विभाजन दोष को ट्रिगर कर सकता है।


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


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


=== संरचना द्वारा परिभाषित प्रकार ===
=== उपयोग या डेटाटाइप द्वारा परिभाषित प्रकार ===


==== ऑटोरिलेटिव पॉइंटर ====
==== ऑटोरिलेटिव (स्वत:सापेक्ष) पॉइंटर ====
एक ऑटोरिलेटिव पॉइंटर एक पॉइंटर होता है जिसका मान पॉइंटर के एड्रैस से ऑफ़सेट के रूप में व्याख्या किया जाता है; इस प्रकार, यदि डेटा संरचना में एक ऑटोरिलेटिव पॉइंटर सदस्य है जो डेटा संरचना के कुछ हिस्से को इंगित करता है, तो डेटा संरचना को ऑटो रिलेटिव पॉइंटर के मान को अपडेट किए बिना मेमोरी में स्थानांतरित किया जा सकता है।<ref>{{cite patent
एक ऑटोरिलेटिव पॉइंटर एक पॉइंटर होता है जिसका मान पॉइंटर के एड्रैस से ऑफ़सेट के रूप में व्याख्या किया जाता है; इस प्रकार, यदि डेटा संरचना में एक ऑटोरिलेटिव पॉइंटर सदस्य है जो डेटा संरचना के कुछ भाग को इंगित करता है, तो डेटा संरचना को ऑटो रिलेटिव पॉइंटर के मान को अपडेट किए बिना मेमोरी में स्थानांतरित किया जा सकता है।<ref>{{cite patent
     | country  = us
     | country  = us
     | number  = 6625718
     | number  = 6625718
Line 375: Line 368:
   }}
   }}
</ref>
</ref>
उद्धृत पेटेंट <!-- This "patent" cannot be valid as this is simply an attempt to essentially rename the meaning of the word "offset" that has been in constant use since the dawn of computers !-->एक ही चीज़ का अर्थ करने के लिए स्व-सापेक्ष पॉइन्टर शब्द का भी उपयोग करता है। हालाँकि, उस शब्द का अर्थ अन्य तरीकों से उपयोग किया गया है:
 
* पॉइन्टर के एड्रैस के बजाय संरचना के एड्रैस से ऑफ़सेट का मतलब;{{citation needed|date=September 2011}}
उद्धृत पेटेंट एक ही वस्तु का अर्थ करने के लिए स्व-सापेक्ष पॉइन्टर शब्द का भी उपयोग करता है। हालाँकि, उस शब्द का अर्थ अन्य तरीकों से उपयोग किया गया है:
* मतलब एक पॉइन्टर जिसमें अपना एड्रैस होता है, जो मेमोरी के किसी भी मनमाना क्षेत्र में पुनर्निर्माण के लिए उपयोगी हो सकता है जो एक दूसरे को इंगित करने वाले डेटा संरचनाओं का संग्रह होता है।<ref>{{cite patent
* पॉइन्टर के एड्रैस के अतिरिक्त संरचना के एड्रैस से ऑफ़सेट का तात्पर्य;{{citation needed|date=September 2011}}
* तात्पर्य एक पॉइन्टर जिसमें अपना एड्रैस होता है, जो मेमोरी के किसी भी एकपक्षीय क्षेत्र में पुनर्निर्माण के लिए उपयोगी हो सकता है जो एक दूसरे को इंगित करने वाले डेटा संरचनाओं का संग्रह होता है।<ref>{{cite patent
     | country  = us
     | country  = us
     | number  = 6115721
     | number  = 6115721
Line 394: Line 388:
एक आधारित पॉइंटर एक पॉइंटर होता है जिसका मान दूसरे पॉइंटर के मान से ऑफ़सेट होता है। इसका उपयोग डेटा के ब्लॉक को संग्रहित और लोड करने के लिए किया जा सकता है, ब्लॉक की प्रारंभ के एड्रैस को बेस पॉइंटर को निर्दिष्ट कर सकता है।<ref>{{cite web|url=http://msdn.microsoft.com/en-us/library/57a97k4e.aspx |title=Based Pointers |publisher=Msdn.microsoft.com |access-date=2018-04-13}}</ref>
एक आधारित पॉइंटर एक पॉइंटर होता है जिसका मान दूसरे पॉइंटर के मान से ऑफ़सेट होता है। इसका उपयोग डेटा के ब्लॉक को संग्रहित और लोड करने के लिए किया जा सकता है, ब्लॉक की प्रारंभ के एड्रैस को बेस पॉइंटर को निर्दिष्ट कर सकता है।<ref>{{cite web|url=http://msdn.microsoft.com/en-us/library/57a97k4e.aspx |title=Based Pointers |publisher=Msdn.microsoft.com |access-date=2018-04-13}}</ref>


 
=== संरचना द्वारा परिभाषित प्रकार ===
=== उपयोग या डेटाटाइप === द्वारा परिभाषित प्रकार


==== एकाधिक संकेत ====
==== एकाधिक संकेत ====
कुछ भाषाओं में, एक पॉइंटर दूसरे पॉइंटर को संदर्भित कर सकता है, जिसके लिए मूल मान प्राप्त करने के लिए कई डीरेफेरेंस ऑपरेशंस की आवश्यकता होती है। जबकि संकेत का प्रत्येक स्तर एक प्रदर्शन लागत जोड़ सकता है, जटिल डेटा संरचनाओं के लिए सही गतिविधि प्रदान करने के लिए कभी-कभी यह आवश्यक होता है। उदाहरण के लिए, सी में एक तत्व के संदर्भ में एक लिंक्ड सूची को परिभाषित करना सामान्य है जिसमें सूची के अगले तत्व के लिए पॉइन्टर होता है:
कुछ भाषाओं में, एक पॉइंटर दूसरे पॉइंटर को संदर्भित कर सकता है, जिसके लिए मूल मान प्राप्त करने के लिए कई संदर्भित संचालन की आवश्यकता होती है। जबकि संकेत का प्रत्येक स्तर एक प्रदर्शन कीमत जोड़ सकता है, जटिल डेटा संरचनाओं के लिए सही गतिविधि प्रदान करने के लिए कभी-कभी यह आवश्यक होता है। उदाहरण के लिए, C में एक तत्व के संदर्भ में एक लिंक्ड सूची को परिभाषित करना सामान्य है जिसमें सूची के अगले तत्व के लिए पॉइन्टर होता है:
  struct element {
  struct element {
    struct element *next;
  struct element *next;
    int           value;
  int value;
  };
  };
   
   
  struct element *head = NULL;
  struct element *head = NULL;


 
यह कार्यान्वयन पूरी सूची के लिए प्रतिनिधि के रूप में सूची में पहले तत्व के लिए पॉइन्टर का उपयोग करता है। यदि सूची के आरंभ में एक नया मान जोड़ा जाता है, तब नए तत्व को इंगित करने के लिए <code>head</code> को बदलना होगा। चूंकि C तर्क सदैव मूल्य से पारित होते हैं, दोहरे संकेत का उपयोग करके सम्मिलन को सही रूप से कार्यान्वित करने की स्वीकृति मिलती है, और सूची के सामने सम्मिलन से सम्पर्क के लिए विशेष केस कोड को समाप्त करने का वांछनीय दुष्प्रभाव होता है:
यह कार्यान्वयन पूरी सूची के लिए सरोगेट के रूप में सूची में पहले तत्व के लिए पॉइन्टर का उपयोग करता है। यदि सूची के आरंभ में एक नया मान जोड़ा जाता है, <code>head</code> नए तत्व को इंगित करने के लिए बदलना होगा। चूंकि सी तर्क हमेशा मूल्य से पारित होते हैं, डबल इंडिकेशन का उपयोग करके सम्मिलन को सही ढंग से कार्यान्वित करने की स्वीकृति मिलती है, और सूची के सामने सम्मिलन से निपटने के लिए विशेष केस कोड को खत्म करने का वांछनीय दुष्प्रभाव होता है:


  // Given a sorted list at *head, insert the element item at the first
  // Given a sorted list at *head, insert the element item at the first
  // location where all earlier elements have lesser or equal value.
  // location where all earlier elements have lesser or equal value.
  void insert(struct element **head, struct element *item) {
  void insert(struct element **head, struct element *item) {
    struct element **p; // p points to a pointer to an element
  struct element **p; // p points to a pointer to an element
    for (p = head; *p != NULL; p = &(*p)->next) {
  for (p = head; *p;!= NULL; p = &(*p)->next) {
        if (item->value <= (*p)->value)
  if (item->value <= (*p)->value)
            break;
  break;
    }
  }
    item->next = *p;
  item->next = *p;
    *p = item;
  *p = item;
  }
  }
   
   
  // Caller does this:
  // Caller does this:
  insert(&head, item);
  insert(&head, item);
इस स्थिति में, यदि का मान <code>item</code> से कम है <code>head</code>, फोन करने वाले का <code>head</code> नए आइटम के एड्रैस पर ठीक से अपडेट किया गया है।
इस स्थिति में, यदि का मान <code>item</code> से कम है <code>head</code>, फोन करने वाले का <code>head</code> नए आइटम के एड्रैस पर परिशुद्ध रूप से अपडेट किया गया है।


एक मूल उदाहरण [[argv]] तर्क में main function#C और C++|main function in C (और C++) में है, जो प्रोटोटाइप में दिया गया है <code>char **argv</code>—यह इसलिए है क्योंकि वेरिएबल <code>argv</code> स्वयं तार की एक सरणी (सरणियों की एक सरणी) के लिए एक पॉइन्टर है, इसलिए <code>*argv</code> 0 वीं स्ट्रिंग के लिए एक पॉइन्टर है (सम्मेलन द्वारा कार्यक्रम का नाम), और <code>**argv</code> 0वीं स्ट्रिंग का 0वां वर्ण है।
एक मूल उदाहरण C (और C++) में मुख्य फ़ंक्शन के [[argv]] तर्क में है, जो प्रोटोटाइप में <code>char **argv</code>—के रूप में दिया गया है - ऐसा इसलिए है क्योंकि वेरिएबल <code>argv</code> स्वयं स्ट्रिंग्स की एक सरणी के लिए एक पॉइन्टर है (एक सरणी की सरणियाँ), इसलिए <code>*argv</code> 0 वीं स्ट्रिंग के लिए एक पॉइन्टर है (कन्वेंशन द्वारा प्रोग्राम का नाम), और <code>**argv</code> 0वीं स्ट्रिंग का 0वां वर्ण है।


==== फंक्शन पॉइंटर ====
==== फंक्शन पॉइंटर ====
कुछ भाषाओं में, एक पॉइंटर निष्पादन योग्य कोड को संदर्भित कर सकता है, अर्थात यह किसी फ़ंक्शन, विधि या प्रक्रिया को इंगित कर सकता है। एक फ़ंक्शन पॉइंटर फ़ंक्शन के एड्रैस को आमंत्रित करने के लिए संग्रहीत करेगा। जबकि इस सुविधा का उपयोग कार्यों को गतिशील रूप से कॉल करने के लिए किया जा सकता है, यह प्रायः वायरस और अन्य दुर्भावनापूर्ण सॉफ़्टवेयर लेखकों की पसंदीदा तकनीक है।
कुछ भाषाओं में, एक पॉइंटर निष्पादन योग्य कोड को संदर्भित कर सकता है, अर्थात यह किसी फ़ंक्शन, विधि या प्रक्रिया को इंगित कर सकता है। एक फ़ंक्शन पॉइंटर फ़ंक्शन के एड्रैस को कॉल करने के लिए संग्रहीत करेगा। जबकि इस फीचर का उपयोग फंक्शनों को गतिशील रूप से कॉल करने के लिए किया जा सकता है, यह प्रायः वायरस और अन्य दुर्भावनापूर्ण सॉफ़्टवेयर लेखकों की चयनात्मक तकनीक है।
  int sum(int n1, int n2) {   // Function with two integer parameters returning an integer value
  int sum(int n1, int n2) { // Function with two integer parameters returning an integer value
    return n1 + n2;
  return n1 + n2;
  }
  }
   
   
  int main(void) {
  int main(void) {
    int a, b, x, y;
  int a, b, x, y;
    int (*fp)(int, int);   // Function pointer which can point to a function like sum
  int (*fp)(int, int); // Function pointer which can point to a function like sum
    fp = &amp;sum;             // fp now points to function sum
  fp = &amp;sum; // fp now points to function sum
    x = (*fp)(a, b);       // Calls function sum with arguments a and b
  x = (*fp)(a, b); // Calls function sum with arguments a and b
    y = sum(a, b);         // Calls function sum with arguments a and b
  y = sum(a, b); // Calls function sum with arguments a and b
  }
  }


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


== एक सरणी अनुक्रमणिका का उपयोग कर सिमुलेशन ==
== एक सरणी अनुक्रमणिका का उपयोग कर सिमुलेशन ==
एक (सामान्य रूप से एक-आयामी) सरणी के इंडेक्स का उपयोग करके पॉइन्टर गतिविधि को अनुकरण करना संभव है।
एक (सामान्य रूप से एक-आयामी) सरणी के सूचकांक का उपयोग करके पॉइन्टर गतिविधि को अनुकरण करना संभव है।


मुख्य रूप से उन भाषाओं के लिए जो स्पष्ट रूप से पॉइंटर्स का समर्थन नहीं करती हैं, लेकिन सरणियों का समर्थन करती हैं, ऐरे डेटा प्रकार के बारे में सोचा और संसाधित किया जा सकता है जैसे कि यह संपूर्ण मेमोरी रेंज (विशेष एरे के दायरे के अंदर) और किसी भी इंडेक्स के बारे में सोचा जा सकता है। असेंबली भाषा में एक सामान्य उद्देश्य रजिस्टर के बराबर (जो व्यक्तिगत बाइट्स को इंगित करता है लेकिन जिसका वास्तविक मूल्य सरणी की प्रारंभ के सापेक्ष है, मेमोरी में इसका पूर्ण एड्रैस नहीं)।
मुख्य रूप से उन भाषाओं के लिए जो स्पष्ट रूप से पॉइंटर्स का समर्थन नहीं करती हैं, लेकिन सरणियों का समर्थन करती हैं, सरणी डेटा प्रकार के बारे में सोचा और संसाधित किया जा सकता है जैसे कि यह संपूर्ण मेमोरी सीमा (विशेष सरणी के प्रसार के अंदर) और किसी भी इंडेक्स के बारे में विचार किया जा सकता है। असेंबली भाषा में एक सामान्य उद्देश्य रजिस्टर के समान (जो व्यक्तिगत बाइट्स को इंगित करता है लेकिन जिसका वास्तविक मूल्य सरणी की प्रारंभ के सापेक्ष है, मेमोरी में इसका पूर्ण एड्रैस नहीं)। सरणी मानते हुए, कहते हैं, एक सन्निहित 16 [[मेगाबाइट]] वर्ण डेटा संरचना, व्यक्तिगत बाइट्स (या सरणी के अंदर सन्निहित बाइट्स का एक [[स्ट्रिंग (कंप्यूटर विज्ञान)]]) को प्रत्यक्ष रूप से संबोधित किया जा सकता है और 31 बिट अहस्ताक्षरित पूर्णांक के साथ सरणी के नाम का उपयोग करके कुशलतापूर्वक प्रयोग किया जा सकता है। सिम्युलेटेड पॉइंटर के रूप में (यह ऊपर दिखाए गए C सरणियों के उदाहरण के समान है)। पॉइंटर अंकगणित को वास्तविक पॉइंटर अंकगणित की तुलना में न्यूनतम अतिरिक्त ओवरहेड के साथ इंडेक्स से जोड़कर या घटाकर अनुकरण किया जा सकता है।
सरणी मानते हुए, कहते हैं, एक सन्निहित 16 [[मेगाबाइट]] वर्ण डेटा संरचना, व्यक्तिगत बाइट्स (या सरणी के अंदर सन्निहित बाइट्स का एक [[स्ट्रिंग (कंप्यूटर विज्ञान)]]) को सीधे संबोधित किया जा सकता है और 31 बिट अहस्ताक्षरित पूर्णांक के साथ सरणी के नाम का उपयोग करके कुशलतापूर्वक प्रयोग किया जा सकता है। सिम्युलेटेड पॉइंटर के रूप में (यह ऊपर दिखाए गए C सरणियों के उदाहरण के समान है)। पॉइंटर अंकगणित को वास्तविक पॉइंटर अंकगणित की तुलना में न्यूनतम अतिरिक्त ओवरहेड के साथ इंडेक्स से जोड़कर या घटाकर अनुकरण किया जा सकता है।


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


== विभिन्न प्रोग्रामिंग भाषाओं में समर्थन ==
== विभिन्न प्रोग्रामिंग भाषाओं में समर्थन ==


=== अदा ===
=== एडीए ===
एडा (प्रोग्रामिंग भाषा) एक दृढ़ता से टाइप की जाने वाली भाषा है जहां सभी पॉइंटर्स टाइप किए जाते हैं और केवल सुरक्षित प्रकार के रूपांतरणों की स्वीकृति है। डिफ़ॉल्ट रूप से सभी पॉइंटर्स को इनिशियलाइज़ किया जाता है <code>null</code>, और डेटा तक पहुँचने का कोई भी प्रयास a <code>null</code> पॉइन्टर अपवाद हैंडलिंग को उठाए जाने का कारण बनता है। Ada में पॉइंटर्स को [[पहुंच प्रकार]] कहा जाता है। Ada 83 ने अभिगम्य प्रकारों पर अंकगणित की स्वीकृति नहीं दी (हालाँकि कई कंपाइलर विक्रेता इसके लिए एक गैर-मानक विशेषता के रूप में प्रदान करते हैं), लेकिन Ada 95 पैकेज के माध्यम से अभिगम्य प्रकारों पर "सुरक्षित" अंकगणित का समर्थन करता है <code>System.Storage_Elements</code>.
एडीए (प्रोग्रामिंग भाषा) एक दृढ़ता से टाइप की जाने वाली भाषा है जहां सभी पॉइंटर्स टाइप किए जाते हैं और केवल सुरक्षित प्रकार के रूपांतरणों की स्वीकृति है। डिफ़ॉल्ट रूप से सभी पॉइंटर्स को इनिशियलाइज़ (आरंभीकृत) किया जाता है <code>null</code>, और डेटा तक अभिगम्य का कोई भी प्रयास a <code>null</code> पॉइन्टर एक्सेप्शन हैंडलिंग को किए जाने का कारण बनता है। एडीए में पॉइंटर्स को [[पहुंच प्रकार]] कहा जाता है। एडीए 83 ने अभिगम्य प्रकारों पर अंकगणित की स्वीकृति नहीं दी (हालाँकि कई कंपाइलर विक्रेता इसके लिए एक गैर-मानक विशेषता के रूप में प्रदान करते हैं), लेकिन एडीए 95 पैकेज <code>System.Storage_Elements</code>के माध्यम से अभिगम्य प्रकारों पर "सुरक्षित" अंकगणित का समर्थन करता है


=== [[बुनियादी]] ===
=== [[बुनियादी|प्रारम्भिक सर्व-उद्देश्यीय प्रतीकात्मक निर्देश कोड]] ===
Windows प्लेटफ़ॉर्म के लिए BASIC के कई पुराने संस्करणों में स्ट्रिंग का एड्रैस वापस करने के लिए STRPTR () और एक वेरिएबल का एड्रैस वापस करने के लिए VARPTR () के लिए समर्थन था। विजुअल बेसिक 5 में ओबीजेपीटीआर () के लिए एक ऑब्जेक्ट इंटरफेस का एड्रैस वापस करने के लिए और एक ADDRESSOF ऑपरेटर के लिए एक फ़ंक्शन का एड्रैस वापस करने के लिए समर्थन था। इन सभी के प्रकार पूर्णांक हैं, लेकिन उनके मान पॉइन्टर प्रकारों द्वारा रखे गए के बराबर हैं।
विंडोज प्लेटफ़ॉर्म के लिए प्रारम्भिक सर्व-उद्देश्यीय प्रतीकात्मक निर्देश कोड के कई पुराने संस्करणों में स्ट्रिंग का एड्रैस वापस करने के लिए एसटीआरपीटीआर () और एक वेरिएबल का एड्रैस वापस करने के लिए वीएआरपीटीआर () के लिए समर्थन था। विजुअल प्रारम्भिक सर्व-उद्देश्यीय प्रतीकात्मक निर्देश कोड 5 में ओबीजेपीटीआर () के लिए एक ऑब्जेक्ट इंटरफेस का एड्रैस वापस करने के लिए और एक एड्रैसऑफ ऑपरेटर के लिए एक फ़ंक्शन का एड्रैस वापस करने के लिए समर्थन था। इन सभी के प्रकार पूर्णांक हैं, लेकिन उनके मान पॉइन्टर प्रकारों द्वारा रखे गए के समान हैं।


हालाँकि, BASIC की नई बोलियाँ, जैसे FreeBASIC या [[BlitzMax]], में संपूर्ण पॉइंटर कार्यान्वयन हैं। FreeBASIC में, अंकगणित पर <code>ANY</code> पॉइंटर्स (सी के बराबर <code>void*</code>) के रूप में माना जाता है <code>ANY</code> पॉइन्टर एक बाइट चौड़ाई थी। <code>ANY</code> पॉइंटर्स को डीरेफरेंस नहीं किया जा सकता है, जैसा कि सी में भी है, बीच में कास्टिंग <code>ANY</code> और किसी अन्य प्रकार के पॉइंटर कोई चेतावनी उत्पन्न नहीं करेंगे।
हालाँकि, प्रारम्भिक सर्व-उद्देश्यीय प्रतीकात्मक निर्देश कोड की नई भाषाओ, जैसे मुक्त-[[बुनियादी|प्रारम्भिक सर्व-उद्देश्यीय प्रतीकात्मक निर्देश कोड]] या [[BlitzMax|ब्लिट्ज मैक्स]], में संपूर्ण पॉइंटर कार्यान्वयन हैं। मुक्त-[[बुनियादी|प्रारम्भिक सर्व-उद्देश्यीय प्रतीकात्मक निर्देश कोड]] में, अंकगणित पर <code>ANY</code> पॉइंटर्स (C के समान <code>void*</code>) के रूप में माना जाता है <code>ANY</code> पॉइन्टर एक बाइट चौड़ाई थी। <code>ANY</code> पॉइंटर्स को C संदर्भित नहीं किया जा सकता है, जैसा कि <code>ANY</code> और किसी अन्य प्रकार के पॉइंटर्स के बीच कास्टिंग करने से कोई संकेत उत्पन्न नहीं करेंगे।
  dim as integer f = 257
  dim as integer f = 257
  dim as any ptr g = @f
  dim as any ptr g = @f
Line 468: Line 458:
  assert( (g + 4) = (@f + 1) )
  assert( (g + 4) = (@f + 1) )


=== सी और सी ++ ===
=== C और C ++ ===
C (प्रोग्रामिंग भाषा) और C++ पॉइंटर्स वेरिएबल्स हैं जो एड्रैस को संग्रहित करते हैं और शून्य हो सकते हैं। प्रत्येक पॉइन्टर के पास एक प्रकार होता है जिसे वह इंगित करता है, लेकिन कोई पॉइन्टर प्रकारों के बीच स्वतंत्र रूप से कास्ट कर सकता है (लेकिन फ़ंक्शन पॉइंटर और ऑब्जेक्ट पॉइंटर के बीच नहीं)। एक विशेष पॉइन्टर प्रकार जिसे "शून्य पॉइन्टर" कहा जाता है, किसी भी (गैर-फ़ंक्शन) ऑब्जेक्ट को इंगित करने की स्वीकृति देता है, लेकिन इस तथ्य से सीमित है कि इसे सीधे संदर्भित नहीं किया जा सकता है (इसे कास्ट किया जाएगा)। पर्याप्त आकार के एक अभिन्न प्रकार से और उसके लिए एक पॉइन्टर को कास्ट करके एड्रैस ही प्रायः सीधे कुशलतापूर्वक प्रयोग किया जा सकता है, हालांकि परिणाम कार्यान्वयन-परिभाषित होते हैं और वास्तव में अपरिभाषित गतिविधि का कारण बन सकते हैं; जबकि पहले सी मानकों में एक अभिन्न प्रकार नहीं था जो अपेक्षाकृत अधिक बड़ा होने की गारंटी देता था, सी 99 निर्दिष्ट करता है <code>uintptr_t</code> [[typedef]] नाम में परिभाषित किया गया है <code>[[C_data_types#Fixed-width_integer_types|<stdint.h>]]</code>, लेकिन कार्यान्वयन के लिए इसे प्रदान करने की आवश्यकता नहीं है।
C (प्रोग्रामिंग भाषा) और C++ पॉइंटर्स वेरिएबल्स हैं जो एड्रैस को संग्रहित करते हैं और शून्य हो सकते हैं। प्रत्येक पॉइन्टर के पास एक प्रकार होता है जिसे वह इंगित करता है, लेकिन कोई पॉइन्टर प्रकारों के बीच स्वतंत्र रूप से कास्ट कर सकता है (लेकिन फ़ंक्शन पॉइंटर और ऑब्जेक्ट पॉइंटर के बीच नहीं)। एक विशेष पॉइन्टर प्रकार जिसे "शून्य पॉइन्टर" कहा जाता है, किसी भी (गैर-फ़ंक्शन) ऑब्जेक्ट को इंगित करने की स्वीकृति देता है, लेकिन इस तथ्य से सीमित है कि इसे प्रत्यक्ष रूप से संदर्भित नहीं किया जा सकता है (इसे कास्ट किया जाएगा)। पर्याप्त आकार के एक अभिन्न प्रकार से और उसके लिए एक पॉइन्टर को कास्ट करके एड्रैस ही प्रायः प्रत्यक्ष रूप से कुशलतापूर्वक प्रयोग किया जा सकता है, हालांकि परिणाम कार्यान्वयन-परिभाषित होते हैं और वास्तव में अपरिभाषित गतिविधि का कारण बन सकते हैं; जबकि पहले C मानकों में एक अभिन्न प्रकार नहीं था जो अपेक्षाकृत अधिक बड़ा होने की प्रत्याभूति देता था, C 99 <code>[[C_data_types#Fixed-width_integer_types|<stdint.h>]]</code>में परिभाषित <code>uintptr_t</code> [[typedef]] नाम निर्दिष्ट करता है, लेकिन एक कार्यान्वयन को इसे प्रदान करने की आवश्यकता नहीं है।


सी ++ पूरी तरह से सी पॉइंटर्स और सी टाइपकास्टिंग का समर्थन करता है। यह संकलन-समय पर कुछ अनपेक्षित खतरनाक जातियों को पकड़ने में मदद करने के लिए टाइपकास्टिंग ऑपरेटरों के एक नए समूह का भी समर्थन करता है। [[C++11]] के बाद से, C++ मानक लाइब्रेरी|C++ मानक पुस्तकालय स्मार्ट पॉइंटर्स भी प्रदान करता है (<code>unique_ptr</code>, <code>shared_ptr</code> और <code>weak_ptr</code>) जिसका उपयोग कुछ स्थितियों में स्थिति सी पॉइंटर्स के सुरक्षित विकल्प के रूप में किया जा सकता है। C++ संदर्भ के दूसरे रूप का भी समर्थन करता है, जो पॉइन्टर से अपेक्षाकृत अधिक भिन्न होता है, जिसे केवल एक संदर्भ (C++) या संदर्भ प्रकार कहा जाता है।
C ++ पूरी तरह से C पॉइंटर्स और C टाइपकास्टिंग का समर्थन करता है। यह संकलन-समय पर कुछ अनपेक्षित जोखिमयुक्त विक्षेप को प्रग्रहण में सहायता करने के लिए टाइपकास्टिंग ऑपरेटरों के एक नए समूह का भी समर्थन करता है। [[C++11]] के बाद से, C++ मानक लाइब्रेरी स्मार्ट पॉइंटर्स भी प्रदान करता है (<code>unique_ptr</code>, <code>shared_ptr</code> और <code>weak_ptr</code>) जिसका उपयोग कुछ स्थितियों में स्थिति C पॉइंटर्स के सुरक्षित विकल्प के रूप में किया जा सकता है। C++ संदर्भ के दूसरे रूप का भी समर्थन करता है, जो पॉइन्टर से अपेक्षाकृत अधिक भिन्न होता है, जिसे केवल एक संदर्भ (C++) या संदर्भ प्रकार कहा जाता है।


'प्वाइंटर अंकगणित', अर्थात, अंकगणितीय संचालन (साथ ही साथ परिमाण तुलना) के साथ एक पॉइन्टर के लक्ष्य एड्रैस को संशोधित करने की क्षमता, भाषा मानक द्वारा एकल सरणी वस्तु (या उसके ठीक बाद) की सीमा के अंदर रहने के लिए प्रतिबंधित है। और अन्यथा अपरिभाषित गतिविधि का आह्वान करेगा। एक पॉइन्टर से जोड़ना या घटाना इसे अपने डेटाटाइप के आकार के एक से अधिक द्वारा ले जाता है। उदाहरण के लिए, 4-बाइट पूर्णांक मानों में एक पॉइंटर में 1 जोड़ने से पॉइंटर के पॉइंट-टू-बाइट-एड्रेस में 4 की वृद्धि होगी। इसका प्रभाव पूर्णांकों की एक सन्निहित सरणी में अगले तत्व को इंगित करने के लिए पॉइंटर को बढ़ाने का प्रभाव है - जो है प्रायः इच्छित परिणाम। पॉइन्टर अंकगणित पर नहीं किया जा सकता है <code>void</code> पॉइंटर्स क्योंकि [[शून्य प्रकार]] का कोई आकार नहीं है, और इस प्रकार इंगित एड्रैस जोड़ा नहीं जा सकता है, हालांकि जीएनयू कंपाइलर संग्रह और अन्य कंपाइलर बाइट अंकगणितीय प्रदर्शन करेंगे <code>void*</code> एक गैर-मानक विस्तार के रूप में, इसे ऐसा माना जाता है जैसे कि यह था <code>char *</code>.
'प्वाइंटर अंकगणित', अर्थात, अंकगणितीय संचालन (साथ ही साथ परिमाण तुलना) के साथ एक पॉइन्टर के लक्ष्य एड्रैस को संशोधित करने की क्षमता, भाषा मानक द्वारा एकल सरणी वस्तु (या उसके ठीक बाद) की सीमा के अंदर रहने के लिए प्रतिबंधित है। और अन्यथा अपरिभाषित गतिविधि का उपयोग करेगा। एक पॉइन्टर से जोड़ना या घटाना इसे अपने डेटाटाइप के आकार के एक से अधिक द्वारा ले जाता है। उदाहरण के लिए, 4-बाइट पूर्णांक मानों में एक पॉइंटर में 1 जोड़ने से पॉइंटर के पॉइंट-से-बाइट-एड्रेस में 4 की वृद्धि होगी। इसका प्रभाव पूर्णांकों की एक सन्निहित सरणी में अगले तत्व को इंगित करने के लिए पॉइंटर को बढ़ाने का प्रभाव है जो प्रायः नियत परिणाम है। पॉइन्टर <code>void</code> पॉइंटर्स अंकगणित पर नहीं किया जा सकता है क्योंकि [[शून्य प्रकार|शून्य प्रारूप]] का कोई आकार नहीं है, और इस प्रकार इंगित एड्रैस जोड़ा नहीं जा सकता है, हालांकि जीएनयू कंपाइलर संग्रह और अन्य कंपाइलर <code>void*</code> बाइट अंकगणितीय प्रदर्शन करेंगे एक गैर-मानक एक्सटेंशन के रूप में निष्पादित करेंगे इसे इस तरह मानते हैं यह <code>char *</code>थे।


पॉइंटर अंकगणित प्रोग्रामर को विभिन्न प्रकारों से निपटने का एक ही तरीका प्रदान करता है: बाइट्स में वास्तविक ऑफ़सेट के बजाय आवश्यक तत्वों की संख्या को जोड़ना और घटाना। (पॉइन्टर अंकगणित के साथ <code>char *</code> पॉइंटर्स बाइट ऑफ़सेट का उपयोग करते हैं, क्योंकि <code>sizeof(char)</code> परिभाषा के अनुसार 1 है।) विशेष रूप से, सी परिभाषा स्पष्ट रूप से सिंटैक्स की घोषणा करती है <code>a[n]</code>, वह कौन सा है <code>n</code>- सरणी का तत्व <code>a</code>, के बराबर है <code>*(a + n)</code>, जो कि द्वारा इंगित तत्व की सामग्री है <code>a + n</code>. इसका अर्थ यह है कि <code>n[a]</code> के बराबर है <code>a[n]</code>, और कोई लिख सकता है, उदा., <code>a[3]</code> या <code>3[a]</code> किसी सरणी के चौथे तत्व तक पहुँचने के लिए समान रूप से अच्छा <code>a</code>.
पॉइंटर अंकगणित प्रोग्रामर को विभिन्न प्रकारों से सम्पर्क का एक ही तरीका प्रदान करता है: बाइट्स में वास्तविक ऑफ़सेट के अतिरिक्त आवश्यक तत्वों की संख्या को जोड़ना और घटाना। (पॉइन्टर अंकगणित के साथ <code>char *</code> पॉइंटर्स बाइट ऑफ़सेट का उपयोग करते हैं, क्योंकि <code>sizeof(char)</code> परिभाषा के अनुसार 1 है।) विशेष रूप से, C परिभाषा स्पष्ट रूप से सिंटैक्स की घोषणा करती है <code>a[n]</code>, जो कि <code>n</code>- सरणी का तत्व <code>a</code>, के समान है <code>*(a + n)</code>, जो कि <code>a + n</code>द्वारा इंगित तत्व की सामग्री है। इसका अर्थ यह है कि <code>n[a]</code> <code>a[n]</code>के समान है और कोई लिख सकता है, उदाहरण के लिए, <code>a[3]</code> या <code>3[a]</code> किसी सरणी के चौथे तत्व <code>a</code>तक पहुँचने के लिए समान रूप से अच्छा है।


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


<code>void</code> पॉइन्टर, या<code>void*</code>, एएनएसआई सी और सी ++ में एक सामान्य पॉइन्टर प्रकार के रूप में समर्थित है। के लिए एक पॉइंटर <code>void</code> किसी भी ऑब्जेक्ट (फ़ंक्शन नहीं) के एड्रैस को संग्रहित कर सकता है, और, सी में, असाइनमेंट पर किसी अन्य ऑब्जेक्ट पॉइंटर प्रकार में अंतर्निहित रूप से परिवर्तित हो जाता है, लेकिन इसे संदर्भित होने पर स्पष्ट रूप से कास्ट किया जाना चाहिए।
<code>void</code> पॉइन्टर, या<code>void*</code>, अमेरिकन राष्ट्रीय मानक संस्थान C और C ++ में एक सामान्य पॉइन्टर प्रकार के रूप में समर्थित है। के लिए एक पॉइंटर <code>void</code> किसी भी ऑब्जेक्ट (फ़ंक्शन नहीं) के एड्रैस को संग्रहित कर सकता है, और, C में, समनुदेशन पर किसी अन्य ऑब्जेक्ट पॉइंटर प्रकार में अंतर्निहित रूप से परिवर्तित हो जाता है, लेकिन इसे संदर्भित होने पर स्पष्ट रूप से निर्धारित किया जाना चाहिए। K&R C प्रोग्रामिंग भाषा ने "टाइप-एग्नोस्टिक पॉइंटर" उद्देश्य (अमेरिकन राष्ट्रीय मानक संस्थान C से पहले) के लिए वेरिएबल <code>char*</code> का उपयोग किया।
सी प्रोग्रामिंग भाषा | के एंड आर सी का उपयोग किया <code>char*</code> "टाइप-एग्नोस्टिक पॉइंटर" उद्देश्य के लिए (एएनएसआई सी से पहले)
  int x = 4;
  int x = 4;
  void* p1 = &x;
  void* p1 = &x;
  int* p2 = p1;       // void* implicitly converted to int*: valid C, but not C++
  int* p2 = p1; // void* implicitly converted to int*: valid C, but not C++
  int a = *p2;
  int a = *p2;
  int b = *(int*)p1; // when dereferencing inline, there is no implicit conversion
  int b = *(int*)p1; // when dereferencing inline, there is no implicit conversion
सी ++ निहित रूपांतरण की स्वीकृति नहीं देता है <code>void*</code> अन्य पॉइन्टर प्रकारों के लिए, यहां तक ​​कि असाइनमेंट में भी। यह लापरवाह और यहां तक ​​कि अनपेक्षित कास्ट से बचने के लिए एक डिजाइन निर्णय था, हालांकि अधिकांश कंपाइलर अन्य कास्ट का सामना करते समय केवल चेतावनी आउटपुट करते हैं, त्रुटियां नहीं।
C ++ असाइनमेंट में भी <code>void*</code> के अन्य पॉइन्टर प्रकारों के अंतर्निहित रूपांतरण की स्वीकृति नहीं देता है। यह कम और यहां तक ​​कि अनपेक्षित कास्ट से बचने के लिए एक डिजाइन निर्णय था, हालांकि अधिकांश कंपाइलर अन्य कास्ट का सामना करते समय त्रुटियों की चेतावनी नहीं देते हैं।
  int x = 4;
  int x = 4;
  void* p1 = &x;
  void* p1 = &x;
  int* p2 = p1;                    // this fails in C++: there is no implicit conversion from void*
  int* p2 = p1;                    // this fails in C++: there is no implicit conversion from void*
  int* p3 = (int*)p1;               // C-style cast
  int* p3 = (int*)p1; // C-style cast
  int* p4 = reinterpret_cast<int*>(p1); // C++ cast
  int* p4 = reinterpret_cast<int*>(p1); // C++ cast
सी ++ में, नहीं है <code>void&</code> (शून्य के संदर्भ में) पूरक करने के लिए <code>void*</code> (पॉइन्टर को शून्य), क्योंकि संदर्भ उन चरों के लिए उपनामों की तरह गतिविधि करते हैं जिन्हें वे इंगित करते हैं, और कभी भी ऐसा वेरिएबल नहीं हो सकता है जिसका प्रकार है <code>void</code>.
C ++ में, <code>void&</code> (शून्य के संदर्भ में) पूरक करने के लिए <code>void*</code> (पॉइन्टर को शून्य) नहीं है, क्योंकि संदर्भ उन चरों के लिए उपनामों की तरह गतिविधि करते हैं जिन्हें वे इंगित करते हैं, और कभी भी ऐसा वेरिएबल नहीं हो सकता है जिसका प्रकार <code>void</code>है।
 
==== पॉइंटर-से-मेंबर (सदस्य) ====


==== पॉइंटर-टू-मेंबर ====
C ++ पॉइंटर्स में कक्षा के गैर स्थिर सदस्यों को परिभाषित किया जा सकता है। यदि कोई क्लास <code>C</code> एक सदस्य <code>T a</code> है तब <code>&C::a</code> प्रकार <code>T C::*</code>.के सदस्य के लिए एक पॉइन्टर है। यह सदस्य ऑब्जेक्ट या फ़ंक्शन पॉइंटर मेथड पॉइंटर्स हो सकता है।<ref>{{cite web|url=https://isocpp.org/wiki/faq/pointers-to-members|title=Pointers to Member Functions|access-date=2022-11-26|publisher=isocpp.org}}</ref> उनका उपयोग ऑपरेटरों के दाईं ओर <code>.*</code> और <code>->*</code> संबंधित सदस्य तक अभिगम्य के लिए किया जा सकता है।
<!-- →* redirects here. The correct redirect ->* cannot be made due to technical restrictions (WP:NCTR) -->
सी ++ पॉइंटर्स में कक्षा के गैर स्थैतिक सदस्यों को परिभाषित किया जा सकता है। यदि कोई वर्ग <code>C</code> एक सदस्य है <code>T a</code> तब <code>&C::a</code> सदस्य के लिए पॉइन्टर है <code>a</code> प्रकार का <code>T C::*</code>. यह सदस्य ऑब्जेक्ट या फ़ंक्शन पॉइंटर # मेथड पॉइंटर्स हो सकता है।<ref>{{cite web|url=https://isocpp.org/wiki/faq/pointers-to-members|title=Pointers to Member Functions|access-date=2022-11-26|publisher=isocpp.org}}</ref> उनका उपयोग ऑपरेटरों के दाईं ओर किया जा सकता है <code>.*</code> और <code>->*</code> संबंधित सदस्य तक पहुँचने के लिए।
  struct S {
  struct S {
  int a;
  int a;
Line 512: Line 501:
  std::cout << (ptrS->*fp)() << "\n"; // prints 2
  std::cout << (ptrS->*fp)() << "\n"; // prints 2


==== पॉइंटर डिक्लेरेशन सिंटैक्स ओवरव्यू ====
==== सूचक घोषणा सिंटैक्स अवलोकन ====
ये पॉइंटर डिक्लेरेशन पॉइंटर डिक्लेरेशन के अधिकांश वेरिएंट को कवर करते हैं। बेशक ट्रिपल पॉइंटर्स होना संभव है, लेकिन ट्रिपल पॉइंटर के पीछे मुख्य सिद्धांत पहले से ही डबल पॉइंटर में सम्मिलित हैं। यहाँ प्रयुक्त नामकरण क्या अभिव्यक्ति है <code>typeid(type).name()</code> [[g++]] या [[बजना]] का उपयोग करते समय इनमें से प्रत्येक प्रकार के लिए बराबर होता है।<ref>{{cite web|url=https://linux.die.net/man/1/c++filt|title=c++filt(1) - Linux man page}}</ref><ref>{{cite web|url=http://refspecs.linux-foundation.org/cxxabi-1.83.html#mangling|title=Itanium C++ ABI}}</ref>
ये पॉइंटर डिक्लेरेशन (घोषणा) पॉइंटर डिक्लेरेशन के अधिकांश वेरिएंट को सुरक्षा करते हैं। स्वभावतः ट्रिपल पॉइंटर्स होना संभव है, लेकिन ट्रिपल पॉइंटर के पीछे मुख्य सिद्धांत पहले से ही द्विक पॉइंटर में सम्मिलित हैं। [[g++]] या क्लैंग का उपयोग करते समय इनमें से प्रत्येक प्रकार के लिए पद <code>typeid(type).name()</code> के लिए समान होता है।<ref>{{cite web|url=https://linux.die.net/man/1/c++filt|title=c++filt(1) - Linux man page}}</ref><ref>{{cite web|url=http://refspecs.linux-foundation.org/cxxabi-1.83.html#mangling|title=Itanium C++ ABI}}</ref>
  char A5_A5_c [5][5];   /* array of arrays of chars */
  char A5_A5_c [5][5]; /* array of arrays of chars */
  char *A5_Pc [5];       /* array of pointers to chars */
  char *A5_Pc [5]; /* array of pointers to chars */
  char **PPc;           /* pointer to pointer to char ("double pointer") */
  char **PPc; /* pointer to pointer to char ("double pointer") */
  char (*PA5_c) [5];     /* pointer to array(s) of chars */
  char (*PA5_c) [5]; /* pointer to array(s) of chars */
  char *FPcvE();         /* function which returns a pointer to char(s) */
  char *FPcvE(); /* function which returns a pointer to char(s) */
  char (*PFcvE)();       /* pointer to a function which returns a char */
  char (*PFcvE)(); /* pointer to a function which returns a char */
  char (*FPA5_cvE())[5]; /* function which returns pointer to an array of chars */
  char (*FPA5_cvE())[5]; /* function which returns pointer to an array of chars */
  char (*A5_PFcvE[5])(); /* an array of pointers to functions which return a char */
  char (*A5_PFcvE[5])(); /* an array of pointers to functions which return a char */
पॉइंटर्स-टू-मेंबर से जुड़ी निम्नलिखित घोषणाएँ केवल C ++ में मान्य हैं:
पॉइंटर्स-से-मेंबर से जुड़ी निम्नलिखित घोषणाएँ केवल C ++ में मान्य हैं:


  class C;
  class C;
  class D;
  class D;
  char C::* M1Cc;             /* pointer-to-member to char */
  char C::* M1Cc; /* pointer-to-member to char */
  char C::*A5_M1Cc [5];       /* array of pointers-to-member to char */
  char C::*A5_M1Cc [5]; /* array of pointers-to-member to char */
  char* C::* M1CPc;           /* pointer-to-member to pointer to char(s) */
  char* C::* M1CPc; /* pointer-to-member to pointer to char(s) */
  char C::** PM1Cc;           /* pointer to pointer-to-member to char */
  char C::** PM1Cc; /* pointer to pointer-to-member to char */
  char (*M1CA5_c) [5];         /* pointer-to-member to array(s) of chars */
  char (*M1CA5_c) [5]; /* pointer-to-member to array(s) of chars */
  char C::* FM1CcvE();         /* function which returns a pointer-to-member to char */
  char C::* FM1CcvE(); /* function which returns a pointer-to-member to char */
  char D::* C::* M1CM1Dc;     /* pointer-to-member to pointer-to-member to pointer to char(s) */
  char D::* C::* M1CM1Dc; /* pointer-to-member to pointer-to-member to pointer to char(s) */
  char C::* C::* M1CMS_c;     /* pointer-to-member to pointer-to-member to pointer to char(s) */
  char C::* C::* M1CMS_c; /* pointer-to-member to pointer-to-member to pointer to char(s) */
  char (C::* FM1CA5_cvE())[5]; /* function which returns pointer-to-member to an array of chars */
  char (C::* FM1CA5_cvE())[5]; /* function which returns pointer-to-member to an array of chars */
  char (C::* M1CFcvE)()       /* pointer-to-member-function which returns a char */ 
  char (C::* M1CFcvE)() /* pointer-to-member-function which returns a char */ 
 




<code>()</code> ई> और <code>[]</code> से अधिक प्राथमिकता है <code>*</code>.
<code>()</code> और <code>[]</code> की <code>*</code>से अधिक प्राथमिकता है।<ref>Ulf Bilting, Jan Skansholm, "Vägen till C" (the Road to C), third edition, page 169, {{ISBN|91-44-01468-6}}</ref>
<ref>Ulf Bilting, Jan Skansholm, "Vägen till C" (the Road to C), third edition, page 169, {{ISBN|91-44-01468-6}}</ref>




===सी#===
===C#===
C Sharp (प्रोग्रामिंग भाषा) | C# प्रोग्रामिंग भाषा में, पॉइंटर्स केवल कुछ शर्तों के तहत समर्थित होते हैं: पॉइंटर्स सहित कोड के किसी भी ब्लॉक को मार्क के साथ चिह्नित किया जाना चाहिए <code>unsafe</code> कीवर्ड। ऐसे ब्लॉकों को चलाने के लिए सामान्य रूप से उच्च सुरक्षा अनुमतियों की आवश्यकता होती है।
C # (प्रोग्रामिंग भाषा) में, पॉइंटर्स केवल कुछ शर्तों के अंतर्गत समर्थित होते हैं: पॉइंटर्स सहित कोड के किसी भी ब्लॉक को <code>unsafe</code> कीवर्ड के साथ चिह्नित किया जाना चाहिए। ऐसे ब्लॉकों को चलाने के लिए सामान्य रूप से उच्च सुरक्षा अनुमतियों की आवश्यकता होती है। सिंटैक्स अनिवार्य रूप से C ++ के समान है, और बताया गया एड्रैस या तो [[प्रबंधित कोड]] या प्रबंधित कोड मेमोरी हो सकता है। हालाँकि, प्रबंधित मेमोरी के लिए पॉइंटर्स (किसी प्रबंधित ऑब्जेक्ट के लिए कोई पॉइंटर) को <code>fixed</code> कीवर्ड का उपयोग करके घोषित किया जाना चाहिए, जो गारबेज संग्रहण (कंप्यूटर विज्ञान) को मेमोरी प्रबंधन के भाग के रूप में इंगित वस्तु को स्थानांतरित करने से रोकता है, जबकि पॉइन्टर स्कोप (विस्तार) में है, इस प्रकार पॉइन्टर एड्रैस को वैध रखता है।
सिंटैक्स अनिवार्य रूप से सी ++ के समान है, और बताया गया एड्रैस या तो [[प्रबंधित कोड]] या प्रबंधित कोड मेमोरी हो सकता है। हालाँकि, प्रबंधित मेमोरी के लिए पॉइंटर्स (किसी प्रबंधित ऑब्जेक्ट के लिए कोई पॉइंटर) का उपयोग करके घोषित किया जाना चाहिए <code>fixed</code> कीवर्ड, जो गारबेज कलेक्शन (कंप्यूटर साइंस) को मेमोरी प्रबंधन के हिस्से के रूप में इंगित वस्तु को स्थानांतरित करने से रोकता है, जबकि पॉइन्टर दायरे में है, इस प्रकार पॉइन्टर एड्रैस को वैध रखता है।


इसका उपयोग करने से इसका अपवाद है <code>IntPtr</code> संरचना, जो एक सुरक्षित प्रबंधित समतुल्य है <code>int*</code>, और असुरक्षित कोड की आवश्यकता नहीं है। से विधियों का उपयोग करते समय इस प्रकार को प्रायः वापस कर दिया जाता है <code>System.Runtime.InteropServices</code>, उदाहरण के लिए:
इसका एक्सेप्शन <code>IntPtr</code> संरचना का उपयोग करने से है, जो <code>int*</code>के समतुल्य एक सुरक्षित प्रबंधित है, और इसके लिए असुरक्षित कोड की आवश्यकता नहीं है। उदाहरण के लिए <code>System.Runtime.InteropServices</code>, से विधियों का उपयोग करते समय इस प्रारूप को प्रायः प्रतिगमित किया जाता है:
  // Get 16 bytes of memory from the process's unmanaged memory
  // Get 16 bytes of memory from the process's unmanaged memory
  IntPtr pointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(16);
  IntPtr pointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(16);
Line 554: Line 542:
  // Free the allocated memory
  // Free the allocated memory
  System.Runtime.InteropServices.Marshal.FreeHGlobal(pointer);
  System.Runtime.InteropServices.Marshal.FreeHGlobal(pointer);
.NET Framework|.NET फ्रेमवर्क में कई वर्ग और विधियाँ सम्मिलित हैं <code>System</code> और <code>System.Runtime.InteropServices</code> नामस्थान (जैसे <code>Marshal</code> क्लास) जो .NET प्रकारों को रूपांतरित करते हैं (उदाहरण के लिए, <code>System.String</code>) कई प्रबंधित कोड प्रकारों और पॉइंटर्स से और (उदाहरण के लिए, <code>LPWSTR</code> या <code>void*</code>) प्रबंधित कोड के साथ संचार की स्वीकृति देने के लिए। इस तरह के अधिकांश तरीकों में अप्रबंधित कोड के समान सुरक्षा स्वीकृति की आवश्यकता होती है, क्योंकि वे मेमोरी में मनमाने स्थानों को प्रभावित कर सकते हैं।
नेटवर्क समर्थित तकनीक रूप रेखा में <code>System</code> और <code>System.Runtime.InteropServices</code> नामस्थान (जैसे <code>Marshal</code> क्लास) कई क्लास और विधियाँ सम्मिलित हैं, जो नेटवर्क समर्थित तकनीक प्रकारों और पॉइन्टर (उदाहरण के लिए, <code>System.String</code>) कई प्रबंधित कोड प्रकारों और पॉइंटर्स और (उदाहरण के लिए, <code>LPWSTR</code> या <code>void*</code>को रूपांतरित करते हैं।) प्रबंधित कोड के साथ संचार की स्वीकृति देने के लिए परिवर्तित करते है। इस तरह के अधिकांश तरीकों में अप्रबंधित कोड के समान सुरक्षा स्वीकृति की आवश्यकता होती है, क्योंकि वे मेमोरी में यादृच्छिक स्थानों को प्रभावित कर सकते हैं।


=== [[कोबोल]] ===
=== [[कोबोल|सामान्य व्यवसाय-उन्मुख भाषा]] ===
COBOL प्रोग्रामिंग भाषा पॉइंटर्स टू वेरिएबल्स का समर्थन करती है। स्थिति या समूह (रिकॉर्ड) डेटा ऑब्जेक्ट घोषित किए गए <code>LINKAGE SECTION</code> स्वाभाविक रूप से पॉइंटर-आधारित होते हैं, जहां प्रोग्राम के अंदर आवंटित एकमात्र मेमोरी डेटा आइटम के एड्रैस के लिए जगह होती है (सामान्य रूप से एक मेमोरी शब्द)प्रोग्राम सोर्स कोड में, ये डेटा आइटम किसी अन्य की तरह ही उपयोग किए जाते हैं <code>WORKING-STORAGE</code> वेरिएबल, लेकिन उनकी सामग्री परोक्ष रूप से उनके माध्यम से पहुँचा जा सकता है <code>LINKAGE</code> संकेत।
सामान्य व्यवसाय-उन्मुख प्रोग्रामिंग भाषा पॉइंटर्स से वेरिएबल्स का समर्थन करती है। प्रोग्राम के <code>LINKAGE SECTION</code> के अंदर घोषित मूल या समूह (रिकॉर्ड) डेटा ऑब्जेक्ट स्वाभाविक रूप से पॉइंटर-आधारित होते हैं, जहां प्रोग्राम के अंदर आवंटित एकमात्र मेमोरी डेटा वस्तु (सामान्य रूप से एक मेमोरी शब्द) के एड्रैस के लिए स्थान होती है। प्रोग्राम में स्रोत कोड, ये डेटा वस्तु किसी अन्य <code>WORKING-STORAGE</code> की तरह ही उपयोग किए जाते हैं, लेकिन उनकी सामग्री को अप्रत्यक्ष रूप से उनके <code>LINKAGE</code>पॉइंटर्स के माध्यम से एक्सेस किया जाता है।


प्रत्येक पॉइंट-टू-डेटा ऑब्जेक्ट के लिए मेमोरी स्पेस सामान्य रूप से बाहरी सबरूटीन का उपयोग करके गतिशील मेमोरी आवंटन है<code>CALL</code>बयान या एम्बेडेड विस्तारित भाषा निर्माण जैसे कि EXEC CICS |<code>EXEC CICS</code>या एसक्यूएल |<code>EXEC SQL</code>बयान।
प्रत्येक पॉइंट-से-डेटा ऑब्जेक्ट के लिए मेमोरी स्थान सामान्य रूप से बाहरी सबरूटीन <code>CALL</code>स्टेटमेंट्स या एम्बेडेड विस्तारित भाषा निर्माण जैसे <code>EXEC CICS</code>या <code>EXEC SQL</code>स्टेटमेंट्स के माध्यम से गतिशील रूप से आवंटित किया जाता है।


COBOL के विस्तारित संस्करण भी घोषित पॉइन्टर वेरिएबल प्रदान करते हैं <code>USAGE</code> <code>IS</code> <code>POINTER</code> खंड। ऐसे पॉइंटर वेरिएबल्स के मान स्थापित और संशोधित किए जाते हैं <code>SET</code> और <code>SET</code> <code>ADDRESS</code> बयान।
सामान्य व्यवसाय-उन्मुख भाषा के विस्तारित संस्करण <code>USAGE</code> <code>IS</code> <code>POINTER</code> क्लॉज़ के साथ घोषित किए गए पॉइंटर चर भी प्रदान करते हैं। ऐसे पॉइन्टर वेरिएबल के मान <code>SET</code> और <code>SET</code> <code>ADDRESS</code> स्टेटमेंट का उपयोग करके स्थापित और संशोधित किए जाते हैं।


COBOL के कुछ विस्तारित संस्करण भी प्रदान करते हैं <code>PROCEDURE-POINTER</code> वेरिएबल्स, जो फंक्शन पॉइंटर को संग्रहित करने में सक्षम हैं।
सामान्य व्यवसाय-उन्मुख भाषा के कुछ विस्तारित संस्करण <code>PROCEDURE-POINTER</code> भी प्रदान करते हैं, जो निष्पादन योग्य कोड के एड्रैस को संग्रहीत करने में सक्षम हैं।


=== पीएल/आई ===
=== प्रोग्रामिंग भाषा/आई ===
प्रोग्रामिंग भाषा/आई भाषा सभी डेटा प्रकारों (संरचनाओं के संकेत सहित), पुनरावर्तन, [[कंप्यूटर मल्टीटास्किंग]], स्ट्रिंग हैंडलिंग और व्यापक अंतर्निर्मित सबरूटीन्स के लिए पॉइंटर्स के लिए पूर्ण समर्थन प्रदान करती है। प्रोग्रामिंग भाषा/आई अपने समय की प्रोग्रामिंग भाषाओं की तुलना में अपेक्षाकृत अधिक आगे था।{{citation needed|date=February 2014}} पीएल/आई पॉइंटर्स टाइप नहीं किए गए हैं, और इसलिए पॉइंटर डीरेफरेंसिंग या असाइनमेंट के लिए कोई कास्टिंग आवश्यक नहीं है। पॉइंटर के लिए डिक्लेरेशन सिंटैक्स है <code>DECLARE xxx POINTER;</code>, जो xxx नाम के एक पॉइंटर को डिक्लेयर करता है। संकेतकों का प्रयोग किया जाता है <code>BASED</code> वेरिएबल। एक आधारित वेरिएबल को एक डिफ़ॉल्ट लोकेटर के साथ घोषित किया जा सकता है (<code>DECLARE xxx BASED(ppp);</code> या बिना (<code>DECLARE xxx BASED;</code>), जहां xxx एक आधारित वेरिएबल है, जो एक तत्व वेरिएबल, एक संरचना, या एक सरणी हो सकता है, और पीपीपी डिफ़ॉल्ट पॉइन्टर है)। इस तरह के एक वेरिएबल को एक स्पष्ट पॉइन्टर संदर्भ के बिना संबोधित किया जा सकता है (<code>xxx=1;</code>, या डिफ़ॉल्ट लोकेटर (पीपीपी), या किसी अन्य पॉइन्टर के लिए एक स्पष्ट संदर्भ के साथ संबोधित किया जा सकता है (<code>qqq->xxx=1;</code>).
प्रोग्रामिंग भाषा/आई भाषा सभी डेटा प्रकारों (संरचनाओं के संकेत सहित), पुनरावर्तन, [[कंप्यूटर मल्टीटास्किंग]], स्ट्रिंग हैंडलिंग और व्यापक अंतर्निर्मित सबरूटीन्स के लिए पॉइंटर्स के लिए पूर्ण समर्थन प्रदान करती है। प्रोग्रामिंग भाषा/आई अपने समय की प्रोग्रामिंग भाषाओं की तुलना में अपेक्षाकृत अधिक आगे था।{{citation needed|date=February 2014}} प्रोग्रामिंग भाषा/आई पॉइंटर्स टाइप नहीं किए गए हैं, और इसलिए पॉइंटर डीरेफरेंसिंग या समनुदेशन के लिए कोई कास्टिंग आवश्यक नहीं है। पॉइंटर के लिए डिक्लेरेशन सिंटैक्स <code>DECLARE xxx POINTER;</code>, जो xxx नाम के एक पॉइंटर को घोषित करता है। पॉइंटर्स का उपयोग<code>BASED</code> वेरिएबल के साथ किया जाता है। एक आधारित चर को एक डिफ़ॉल्ट लोकेटर के साथ घोषित किया जा सकता है (<code>DECLARE xxx BASED(ppp);</code> या बिना (<code>DECLARE xxx BASED;</code>), जहां xxx एक आधारित वेरिएबल है, जो एक तत्व वेरिएबल, एक संरचना, या एक सरणी हो सकता है, और पीपीपी डिफ़ॉल्ट पॉइन्टर है)। इस तरह के एक वेरिएबल को एक स्पष्ट पॉइन्टर संदर्भ के बिना संबोधित किया जा सकता है (<code>xxx=1;</code>, या डिफ़ॉल्ट लोकेटर (पीपीपी), या किसी अन्य पॉइन्टर (<code>qqq->xxx=1;</code>) के लिए एक स्पष्ट संदर्भ के साथ संबोधित किया जा सकता है।


पॉइंटर अंकगणित पीएल/आई मानक का हिस्सा नहीं है, लेकिन कई कंपाइलर फॉर्म के भावों की स्वीकृति देते हैं <code>ptr = ptr±expression</code>. आईबीएम पीएल/आई में बिल्टिन फ़ंक्शन भी है <code>PTRADD</code> अंकगणित करने के लिए। पॉइन्टर अंकगणित हमेशा बाइट्स में किया जाता है।
पॉइंटर अंकगणित प्रोग्रामिंग भाषा/आई मानक का भाग नहीं है, लेकिन कई कंपाइलर <code>ptr = ptr±expression</code>अभिव्यक्ति के रूप की अभिव्यक्ति की अनुमति देते हैं। अंतर्राष्ट्रीय व्यापार मशीनें निगम प्रोग्रामिंग भाषा/आई में बिल्टिन फ़ंक्शन <code>PTRADD</code> भी है। पॉइंटर अंकगणित सदैव बाइट में किया जाता है।


IBM Enterprise प्रोग्रामिंग भाषा/आई कम्पाइलर के पास टाइप किए गए पॉइंटर का एक नया रूप है जिसे a कहा जाता है <code>HANDLE</code>.
अंतर्राष्ट्रीय व्यापार मशीनें एंटरप्राइज़ प्रोग्रामिंग भाषा/आई कम्पाइलर के पास टाइप किए गए पॉइंटर का एक नया रूप है जिसे <code>HANDLE</code>कहा जाता है।


=== डी ===
=== डी ===
[[डी (प्रोग्रामिंग भाषा)]] सी और सी ++ का व्युत्पन्न है जो सी पॉइंटर्स और सी टाइपकास्टिंग का पूर्ण समर्थन करता है।
[[डी (प्रोग्रामिंग भाषा)]] C और C ++ का व्युत्पन्न है जो C पॉइंटर्स और C टाइपकास्टिंग का पूर्ण समर्थन करता है।


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


=== [[फोरट्रान]] ===
=== [[फोरट्रान]] ===
फोरट्रान | फोरट्रान -90 ने दृढ़ता से टाइप की गई पॉइन्टर क्षमता की प्रारंभ की। फोरट्रान पॉइंटर्स में केवल एक साधारण मेमोरी एड्रेस से अधिक होता है। वे सरणी आयामों की निचली और ऊपरी सीमा, स्ट्राइड्स (उदाहरण के लिए, मनमाना सरणी अनुभागों का समर्थन करने के लिए), और अन्य मेटाडेटा को भी समाहित करते हैं। एक संघ संचालक, <code>=></code> a को जोड़ने के लिए प्रयोग किया जाता है <code>POINTER</code> एक वेरिएबल के लिए जिसमें a है <code>TARGET</code> गुण। फोरट्रान -90 <code>ALLOCATE</code> स्टेटमेंट का उपयोग पॉइंटर को मेमोरी के ब्लॉक से जोड़ने के लिए भी किया जा सकता है। उदाहरण के लिए, लिंक की गई सूची संरचना को परिभाषित करने और बनाने के लिए निम्न कोड का उपयोग किया जा सकता है:
फोरट्रान फोरट्रान -90 ने दृढ़ता से टाइप की गई पॉइन्टर क्षमता की प्रारंभ की। फोरट्रान पॉइंटर्स में केवल एक साधारण मेमोरी एड्रेस से अधिक होता है। वे सरणी आयामों की निचली और ऊपरी सीमा, स्ट्राइड्स (उदाहरण के लिए, एकपक्षीय सरणी अनुभागों का समर्थन करने के लिए), और अन्य मेटाडेटा को भी समाहित करते हैं। एक संघ ऑपरेटर, <code>=></code> a का उपयोग <code>POINTER</code> को एक वेरिएबल से जोड़ने के लिए किया जाता है जिसमें <code>TARGET</code> विशेषता होती है। फोरट्रान -90 <code>ALLOCATE</code> स्टेटमेंट का उपयोग पॉइंटर को मेमोरी के ब्लॉक से जोड़ने के लिए भी किया जा सकता है। उदाहरण के लिए, लिंक की गई सूची संरचना को परिभाषित करने और बनाने के लिए निम्न कोड का उपयोग किया जा सकता है:
  type real_list_t
  type real_list_t
  real :: sample_data(100)
  reall:: sample_data(100)
  type (real_list_t), pointer :: next => null ()
  type (real_list_t), pointere:: next => null ()
  end type
  end type
   
   
  type (real_list_t), target :: my_real_list
  type (real_list_t), targeta:: my_real_list
  type (real_list_t), pointer :: real_list_temp
  type (real_list_t), pointero:: real_list_temp
   
   
  real_list_temp => my_real_list
  real_list_temp => my_real_list
  do
  do
  read (1,iostat=ioerr) real_list_temp%sample_data
  read (1,iostat=ioerr) real_list_temp%sample_data
  if (ioerr /= 0) exit
  if (ioerr /= 0) exit
  allocate (real_list_temp%next)
  allocate (real_list_temp%next)
  real_list_temp => real_list_temp%next
  real_list_temp => real_list_temp%next
  end do
  end do
फोरट्रान-2003 प्रक्रिया संकेतकों के लिए समर्थन जोड़ता है। साथ ही, सी इंटरऑपरेबिलिटी फीचर के हिस्से के रूप में, फोरट्रान-2003 सी-स्टाइल पॉइंटर्स को फोरट्रान पॉइंटर्स और बैक में परिवर्तित करने के लिए आंतरिक कार्यों का समर्थन करता है।
फोरट्रान-2003 प्रक्रिया पॉइंटर्स के लिए समर्थन जोड़ता है। साथ ही, C इंटरऑपरेबिलिटी (अंतर्संचालनीयता) फीचर के भाग के रूप में, फोरट्रान-2003 C-शैली पॉइंटर्स को फोरट्रान पॉइंटर्स और बैक में परिवर्तित करने के लिए आंतरिक फंक्शनों का समर्थन करता है।


=== जाओ ===
=== गो ===
[[जाओ (प्रोग्रामिंग भाषा)]] में पॉइंटर्स होते हैं। इसकी घोषणा सिंटैक्स सी के बराबर है, लेकिन इसके विपरीत लिखा गया है, प्रकार के साथ समाप्त होता है। सी के विपरीत, गो में कचरा संग्रहण है, और पॉइंटर अंकगणित को अस्वीकार करता है। संदर्भ प्रकार, जैसे C++ में सम्मिलित नहीं हैं। कुछ अंतर्निर्मित प्रकार, जैसे मानचित्र और चैनल, बॉक्सिंग होते हैं (अर्थात आंतरिक रूप से वे उत्परिवर्तनीय संरचनाओं के पॉइंटर होते हैं), और इनका उपयोग करके प्रारंभ किया जाता है <code>make</code> समारोह। पॉइंटर्स और नॉन-पॉइंटर्स के बीच एकीकृत सिंटैक्स के दृष्टिकोण में, तीर (<code>-></code>) ऑपरेटर को हटा दिया गया है: पॉइंटर पर डॉट ऑपरेटर डीरेफरेंस्ड ऑब्जेक्ट के क्षेत्र या विधि को संदर्भित करता है। हालाँकि, यह केवल 1 स्तर के संकेत के साथ काम करता है।
[[जाओ (प्रोग्रामिंग भाषा)|गो (प्रोग्रामिंग भाषा)]] में पॉइंटर्स होते हैं। इसकी घोषणा सिंटैक्स C के समान है, लेकिन इसके विपरीत लिखा गया है, प्रकार के साथ समाप्त होता है। C के विपरीत, गो में गारवेज संग्रहण है, और पॉइंटर अंकगणित को अस्वीकार करता है। संदर्भ प्रकार, जैसे C++ में सम्मिलित नहीं हैं। कुछ अंतर्निर्मित प्रकार, जैसे मानचित्र और चैनल, बॉक्सिंग होते हैं (अर्थात आंतरिक रूप से वे उत्परिवर्तनीय संरचनाओं के पॉइंटर होते हैं), और इनका उपयोग करके प्रारंभ किया जाता है और <code>make</code> फ़ंक्शन का उपयोग करके प्रारंभ किए जाते हैं। पॉइंटर्स और गैर-पॉइंटर्स के बीच एकीकृत सिंटैक्स के दृष्टिकोण में, एरो (तीर का चिन्ह) (<code>-></code>) ऑपरेटर को हटा दिया गया है: पॉइंटर पर डॉट ऑपरेटर अपनिर्देशन ऑब्जेक्ट के क्षेत्र या विधि को संदर्भित करता है। हालाँकि, यह केवल 1 स्तर के संकेत के साथ कार्य करता है।


=== जावा ===
=== जावा ===
जावा (प्रोग्रामिंग भाषा) में पॉइंटर्स का कोई स्पष्ट प्रतिनिधित्व नहीं है। इसके बजाय, संदर्भ (कंप्यूटर विज्ञान) का उपयोग करके अधिक जटिल डेटा संरचनाएं जैसे ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग और ऐरे डेटा संरचना प्रयुक्त की जाती हैं। भाषा कोई स्पष्ट पॉइन्टर कुशलतापूर्वक प्रयोग ऑपरेटर प्रदान नहीं करती है। कोड के लिए अभी भी एक अशक्त संदर्भ (अशक्त पॉइन्टर) को हटाने का प्रयास करना संभव है, हालांकि, जिसके परिणामस्वरूप रन-टाइम अपवाद हैंडलिंग को फेंक दिया जाता है। गैर-संदर्भित मेमोरी ऑब्जेक्ट्स द्वारा कब्जा कर लिया गया स्थान स्वचालित रूप से कचरा संग्रहण (कंप्यूटर साइंस) द्वारा रन-टाइम पर पुनर्प्राप्त किया जाता है।<ref>Nick Parlante, [http://cslibrary.stanford.edu/102/PointersAndMemory.pdf#%22Pointers%20and%20Memory%22], [http://cslibrary.stanford.edu# Stanford Computer Science Education Library], pp. 9–10 (2000).</ref>
जावा (प्रोग्रामिंग भाषा) में पॉइंटर्स का कोई स्पष्ट प्रतिनिधित्व नहीं है। इसके अतिरिक्त, संदर्भ (कंप्यूटर विज्ञान) का उपयोग करके अधिक जटिल डेटा संरचनाएं जैसे वस्तु-उन्मुख प्रोग्रामिंग और सरणी डेटा संरचना प्रयुक्त की जाती हैं। भाषा कोई स्पष्ट पॉइन्टर कुशलतापूर्वक प्रयोग ऑपरेटर प्रदान नहीं करती है। कोड के लिए अभी भी एक अशक्त संदर्भ (अशक्त पॉइन्टर) को हटाने का प्रयास करना संभव है, हालांकि, जिसके परिणामस्वरूप रन-टाइम एक्सेप्शन हैंडलिंग को मुक्त कर दिया जाता है। गैर-संदर्भित मेमोरी ऑब्जेक्ट्स द्वारा प्रग्रहण कर लिया गया स्थान स्वचालित रूप से गारवेज संग्रहण (कंप्यूटर विज्ञान) द्वारा रन-टाइम पर पुनर्प्राप्त किया जाता है।<ref>Nick Parlante, [http://cslibrary.stanford.edu/102/PointersAndMemory.pdf#%22Pointers%20and%20Memory%22], [http://cslibrary.stanford.edu# Stanford Computer Science Education Library], pp. 9–10 (2000).</ref>




===मोडुला-2===
===मोडुला-2===
पास्कल के रूप में पॉइंटर्स बहुत अधिक प्रयुक्त किए जाते हैं <code>VAR</code> प्रक्रिया कॉल में पैरामीटर। [[मॉड्यूल-2]] पास्कल की तुलना में और भी अधिक मजबूती से टाइप किया गया है, टाइप सिस्टम से बचने के कम तरीके हैं। [[मॉड्यूल -3]] (जैसे मोडुला-3) के कुछ रूपों में कचरा संग्रह सम्मिलित है।
पास्कल के रूप में पॉइंटर्स बहुत अधिक प्रयुक्त किए जाते हैं <code>VAR</code> प्रक्रिया कॉल में पैरामीटर है। [[मॉड्यूल-2]] पास्कल की तुलना में और भी अधिक दृढ़ता से टाइप किया गया है, टाइप सिस्टम से बचने के कम तरीके हैं। [[मॉड्यूल -3]] (जैसे मोडुला-3) के कुछ रूपों में गारवेज संग्रह सम्मिलित है।
<!-- +++assistance is needed here+++ -->
 




=== ओबेरॉन ===
=== ओबेरॉन ===
मोडुला-2 की तरह ही पॉइंटर्स भी उपलब्ध हैं। टाइप सिस्टम से बचने के अभी भी बहुत कम तरीके हैं और इसलिए [[ओबेरॉन (प्रोग्रामिंग भाषा)]] और इसके वेरिएंट अभी भी मोडुला -2 या इसके वेरिएंट की तुलना में पॉइंटर्स के संबंध में अधिक सुरक्षित हैं। मॉड्यूला -3 के साथ, कचरा संग्रहण भाषा विनिर्देश का एक हिस्सा है।
मोडुला-2 की तरह ही पॉइंटर्स भी उपलब्ध हैं। टाइप सिस्टम से बचने के लिए अभी भी कम तरीके हैं और इसलिए ओबेरॉन (प्रोग्रामिंग भाषा) और इसके वेरिएंट अभी भी मोडुला -2 या इसके वेरिएंट की तुलना में पॉइंटर्स के संबंध में अधिक सुरक्षित हैं। मॉड्यूला -3 के साथ, गारवेज संग्रहण भाषा विनिर्देश का एक भाग है।
<!-- +++assistance is needed here+++ -->
 




=== पास्कल ===
=== पास्कल ===
पॉइंटर्स की विशेषता वाली कई भाषाओं के विपरीत, स्टैंडर्ड [[इंटरनैशनल ऑर्गनाइज़ेशन फॉर स्टैंडर्डाइज़ेशन]] पास्कल (प्रोग्रामिंग भाषा) केवल पॉइंटर्स को गतिशील रूप से बनाए गए वेरिएबल्स को संदर्भित करने की स्वीकृति देता है जो गुमनाम हैं और उन्हें मानक स्टैटिक या लोकल वेरिएबल्स को संदर्भित करने की स्वीकृति नहीं देते हैं।<ref>ISO 7185 Pascal Standard (unofficial copy), section [http://standardpascal.org/iso7185.html#6.4.4%20Pointer-types 6.4.4 Pointer-types] {{Webarchive|url=https://web.archive.org/web/20170424183023/http://www.standardpascal.org/iso7185.html#6.4.4%20Pointer-types |date=2017-04-24 }} and subsequent.</ref> इसमें पॉइन्टर अंकगणित नहीं है। पॉइंटर्स के पास एक संबद्ध प्रकार भी होना चाहिए और एक प्रकार का पॉइंटर किसी अन्य प्रकार के पॉइंटर के साथ संगत नहीं है (उदाहरण के लिए एक पॉइंटर एक पूर्णांक के लिए एक पॉइंटर के साथ संगत नहीं है)। यह अन्य पॉइन्टर कार्यान्वयनों के साथ अंतर्निहित प्रकार के सुरक्षा मुद्दों को समाप्त करने में मदद करता है, विशेष रूप से जो प्रोग्रामिंग भाषा/आई या C (प्रोग्रामिंग भाषा) के लिए उपयोग किए जाते हैं। यह झूलने वाले संकेतकों के कारण होने वाले कुछ जोखिमों को भी दूर करता है, लेकिन गतिशील रूप से संदर्भित स्थान का उपयोग करके जाने की क्षमता <code>dispose</code> मानक प्रक्रिया (जिसका वही प्रभाव है <code>free</code> C (प्रोग्रामिंग भाषा) में पाया गया लाइब्रेरी फंक्शन) का अर्थ है कि लटकने वाले पॉइंटर्स का जोखिम पूरी तरह से समाप्त नहीं हुआ है।<ref>J. Welsh, W. J. Sneeringer, and C. A. R. Hoare, "Ambiguities and Insecurities in Pascal," ''Software: Practice and Experience 7'', pp. 685–696 (1977)</ref>
पॉइंटर्स की विशेषता वाली कई भाषाओं के विपरीत, स्टैंडर्ड [[इंटरनैशनल ऑर्गनाइज़ेशन फॉर स्टैंडर्डाइज़ेशन|अंतरराष्ट्रीय मानकीकरण संगठन]] पास्कल (प्रोग्रामिंग भाषा) केवल पॉइंटर्स को गतिशील रूप से बनाए गए वेरिएबल्स को संदर्भित करने की स्वीकृति देता है जो अज्ञात हैं और उन्हें मानक स्थिर या स्थानीय वेरिएबल्स को संदर्भित करने की स्वीकृति नहीं देते हैं।<ref>ISO 7185 Pascal Standard (unofficial copy), section [http://standardpascal.org/iso7185.html#6.4.4%20Pointer-types 6.4.4 Pointer-types] {{Webarchive|url=https://web.archive.org/web/20170424183023/http://www.standardpascal.org/iso7185.html#6.4.4%20Pointer-types |date=2017-04-24 }} and subsequent.</ref> इसमें पॉइन्टर अंकगणित नहीं है। पॉइंटर्स के पास एक संबद्ध प्रकार भी होना चाहिए और एक प्रकार का पॉइंटर किसी अन्य प्रकार के पॉइंटर के साथ अनुरूप नहीं है (उदाहरण के लिए एक पॉइंटर एक पूर्णांक के लिए एक पॉइंटर के साथ अनुरूप नहीं है)। यह अन्य पॉइन्टर कार्यान्वयनों के साथ अंतर्निहित प्रकार के सुरक्षा समस्याओ को समाप्त करने में सहायता करता है, विशेष रूप से जो प्रोग्रामिंग भाषा/आई या C (प्रोग्रामिंग भाषा) के लिए उपयोग किए जाते हैं। यह अन्य पॉइंटर्स के कारण होने वाले कुछ जोखिमों को भी दूर करता है, लेकिन गतिशील रूप से संदर्भित स्थान का उपयोग करके जाने की क्षमता <code>dispose</code> मानक प्रक्रिया (जिसका वही प्रभाव है <code>free</code> C (प्रोग्रामिंग भाषा) में पाया गया लाइब्रेरी फंक्शन) का अर्थ है कि डांगलिंग पॉइंटर्स का जोखिम पूरी तरह से समाप्त नहीं हुआ है।<ref>J. Welsh, W. J. Sneeringer, and C. A. R. Hoare, "Ambiguities and Insecurities in Pascal," ''Software: Practice and Experience 7'', pp. 685–696 (1977)</ref>
हालांकि, कुछ वाणिज्यिक और खुले स्रोत में पास्कल (या डेरिवेटिव) कंपाइलर कार्यान्वयन-जैसे [[फ़्री पास्कल]],<ref>Free Pascal Language Reference guide, section [http://www.freepascal.org/docs-html/ref/refse15.html#x43-490003.4 3.4 Pointers]</ref> [[एम्बरकाडेरो डेल्फी]] में [[टर्बो पास्कल]] या [[वस्तु पास्कल]]- एक पॉइंटर को मानक स्थिर या स्थानीय वेरिएबल को संदर्भित करने की स्वीकृति है और इसे एक पॉइंटर प्रकार से दूसरे में डाला जा सकता है। इसके अलावा, पॉइंटर अंकगणित अप्रतिबंधित है: पॉइंटर से जोड़ना या घटाना किसी भी दिशा में बाइट्स की संख्या से चलता है, लेकिन इसका उपयोग करके <code>Inc</code> या <code>Dec</code> इसके साथ मानक प्रक्रियाएं पॉइंटर को उस डेटा प्रकार के आकार से ले जाती हैं जिसे इंगित करने के लिए घोषित किया जाता है। नाम के तहत एक अनटाइप्ड पॉइंटर भी दिया गया है <code>Pointer</code>, जो अन्य पॉइन्टर प्रकारों के साथ संगत है।
 
हालांकि, कुछ व्यवसायिक और मुक्त स्रोत में पास्कल (या डेरिवेटिव) कंपाइलर कार्यान्वयन-जैसे [[फ़्री पास्कल|मुक्त पास्कल]],<ref>Free Pascal Language Reference guide, section [http://www.freepascal.org/docs-html/ref/refse15.html#x43-490003.4 3.4 Pointers]</ref> [[एम्बरकाडेरो डेल्फी]] में [[टर्बो पास्कल]] या [[वस्तु पास्कल]]- एक पॉइंटर को मानक स्थिर या स्थानीय वेरिएबल को संदर्भित करने की स्वीकृति है और इसे एक पॉइंटर प्रकार से दूसरे में निर्दिष्ट किया जा सकता है। इसके अतिरिक्त, पॉइंटर अंकगणित अप्रतिबंधित है: पॉइंटर से जोड़ना या घटाना किसी भी दिशा में बाइट्स की संख्या से चलता है, लेकिन इसका उपयोग करके <code>Inc</code> या <code>Dec</code> इसके साथ मानक प्रक्रियाएं पॉइंटर को उस डेटा प्रकार के आकार से ले जाती हैं जिसे इंगित करने के लिए घोषित किया जाता है। <code>Pointer</code>नाम के अंतर्गत एक अनटाइप्ड पॉइंटर भी दिया गया है जो अन्य पॉइन्टर प्रकारों के साथ अनुरूप है।


=== [[पर्ल]] ===
=== [[पर्ल]] ===
पर्ल प्रोग्रामिंग भाषा पॉइंटर्स का समर्थन करती है, हालांकि पैक और अनपैक फ़ंक्शंस के रूप में संभव्यता ही कभी उपयोग किया जाता है। ये केवल संकलित ऑपरेटिंग सिस्टम पुस्तकालयों के साथ साधारण बातचीत के लिए अभिप्रेत हैं। अन्य सभी स्थितियो में, पर्ल संदर्भ (कंप्यूटर विज्ञान) का उपयोग करता है, जो टाइप किए जाते हैं और पॉइन्टर अंकगणित के किसी भी रूप की स्वीकृति नहीं देते हैं। उनका उपयोग जटिल डेटा संरचनाओं के निर्माण के लिए किया जाता है।<ref>{{cite web|author=Contact details |url=http://perldoc.perl.org/perlref.html#Making-References |title=// Making References (Perl References and nested data structures) |publisher=Perldoc.perl.org |access-date=2018-04-13}}</ref>
पर्ल प्रोग्रामिंग भाषा पॉइंटर्स का समर्थन करती है, हालांकि पैक और अनपैक फ़ंक्शंस के रूप में संभव्यता ही कभी उपयोग किया जाता है। ये केवल संकलित ऑपरेटिंग सिस्टम पुस्तकालयों के साथ साधारण परस्पर क्रिया के लिए अभिप्रेत हैं। अन्य सभी स्थितियो में, पर्ल संदर्भ (कंप्यूटर विज्ञान) का उपयोग करता है, जो टाइप किए जाते हैं और पॉइन्टर अंकगणित के किसी भी रूप की स्वीकृति नहीं देते हैं। उनका उपयोग जटिल डेटा संरचनाओं के निर्माण के लिए किया जाता है।<ref>{{cite web|author=Contact details |url=http://perldoc.perl.org/perlref.html#Making-References |title=// Making References (Perl References and nested data structures) |publisher=Perldoc.perl.org |access-date=2018-04-13}}</ref>




Line 665: Line 653:
{{Authority control}}
{{Authority control}}


{{DEFAULTSORT:Pointer (Computing)}}[[Category: उदाहरण सी कोड वाले लेख]] [[Category: डेटा के प्रकार]] [[Category: आदिम प्रकार]] [[Category: अमेरिकी आविष्कार]]
{{DEFAULTSORT:Pointer (Computing)}}  


[[sv:Datatyp#Pekare och referenstyper]]
[[sv:Datatyp#Pekare och referenstyper]]


 
[[Category:All articles with unsourced statements|Pointer (Computing)]]
 
[[Category:Articles with hatnote templates targeting a nonexistent page|Pointer (Computing)]]
[[Category: Machine Translated Page]]
[[Category:Articles with unsourced statements from February 2014|Pointer (Computing)]]
[[Category:Created On 17/02/2023]]
[[Category:Articles with unsourced statements from July 2011|Pointer (Computing)]]
[[Category:Articles with unsourced statements from May 2009|Pointer (Computing)]]
[[Category:Articles with unsourced statements from September 2011|Pointer (Computing)]]
[[Category:CS1 maint|Pointer (Computing)]]
[[Category:Collapse templates|Pointer (Computing)]]
[[Category:Commons category link is locally defined|Pointer (Computing)]]
[[Category:Created On 17/02/2023|Pointer (Computing)]]
[[Category:Lua-based templates|Pointer (Computing)]]
[[Category:Machine Translated Page|Pointer (Computing)]]
[[Category:Multi-column templates|Pointer (Computing)]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists|Pointer (Computing)]]
[[Category:Pages using div col with small parameter|Pointer (Computing)]]
[[Category:Pages with script errors|Pointer (Computing)]]
[[Category:Short description with empty Wikidata description|Pointer (Computing)]]
[[Category:Sidebars with styles needing conversion|Pointer (Computing)]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready|Pointer (Computing)]]
[[Category:Templates generating microformats|Pointer (Computing)]]
[[Category:Templates that add a tracking category|Pointer (Computing)]]
[[Category:Templates that are not mobile friendly|Pointer (Computing)]]
[[Category:Templates that generate short descriptions|Pointer (Computing)]]
[[Category:Templates using TemplateData|Pointer (Computing)]]
[[Category:Templates using under-protected Lua modules|Pointer (Computing)]]
[[Category:Webarchive template wayback links|Pointer (Computing)]]
[[Category:Wikipedia fully protected templates|Div col]]
[[Category:Wikipedia metatemplates|Pointer (Computing)]]
[[Category:अमेरिकी आविष्कार|Pointer (Computing)]]
[[Category:आदिम प्रकार|Pointer (Computing)]]
[[Category:उदाहरण सी कोड वाले लेख|Pointer (Computing)]]
[[Category:डेटा के प्रकार|Pointer (Computing)]]

Latest revision as of 10:35, 10 March 2023

अन्य उपयोगों के लिए, पॉइंटर (बहुविकल्पी) देखें।

मैं कंप्यूटर विज्ञान के "सबसे कीमती कोष" के बीच [˞[असाइनमेंट स्टेटमेंट और पॉइंटर वैरिएबल]] मानता हूं।

डोनाल्ड नुथ, संरचित प्रोग्रामिंग, स्टेटमेंट्स पर जाएँ।[1]

पॉइंटर a वेरिएबल b से जुड़े मेमोरी एड्रेस की ओर संकेत करता है। इस आरेख में, कंप्यूटिंग संरचना समान एड्रैस स्थान और औपचारिक विवरण दोनों पॉइंटर्स और गैर-पॉइंटर्स के लिए उपयोग करता है; यह जरूरत नहीं होनी चाहिए।

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

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

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

पॉइंटर अधिक अमूर्त संदर्भ डेटा प्रकार का एक सामान्य, अधिक मूर्त कार्यान्वयन है। कई भाषाएँ, विशेष रूप से निम्न-स्तरीय भाषाएँ, कुछ प्रकार के पॉइंटर का समर्थन करती हैं, हालाँकि कुछ में दूसरों की तुलना में उनके उपयोग पर अधिक प्रतिबंध हैं। जबकि "पॉइंटर" का उपयोग सामान्य रूप से संदर्भों को संदर्भित करने के लिए किया गया है, यह डेटा संरचनाओं पर अधिक उपयुक्त रूप से प्रयुक्त होता है जिसका इंटरफ़ेस स्पष्ट रूप से पॉइंटर को कुशलतापूर्वक प्रयोग करने की स्वीकृति देता है (अंकगणितीय रूप से पॉइंटर अंकगणित के माध्यम से) एक मेमोरी एड्रेस के रूप में, एक मैजिक कुकी या क्षमता के विपरीत जो ऐसी स्वीकृति नहीं देता।[citation needed] क्योंकि पॉइंटर्स मेमोरी एड्रैस तक सुरक्षित और असुरक्षित दोनों तरह की अभिगम्य की स्वीकृति देते हैं, इसलिए, विशेषकर बाद के स्थिति में उनका उपयोग करने से जुड़े जोखिम हैं। प्रिमिटिव पॉइंटर्स को प्रायः पूर्णांक के समान प्रारूप में संग्रहीत किया जाता है; हालांकि, इस तरह के पॉइंटर को डीरेफरेंस या "लुक अप" करने का प्रयास जिसका मान वैध मेमोरी एड्रेस नहीं है, प्रोग्राम क्रैश (या अमान्य डेटा हो सकता है) का कारण बन सकता है। इस संभावित समस्या को कम करने के लिए, प्रकार की सुरक्षा के स्थिति में, पॉइंटर्स को एक अलग प्रकार माना जाता है, जिस प्रकार के डेटा को वे इंगित करते हैं, तथापि अंतर्निहित प्रतिनिधित्व एक पूर्णांक हो। अन्य संशोधन भी किए जा सकते हैं (जैसे सत्यापन और सीमा जाँच), यह सत्यापित करने के लिए कि पॉइंटर चर में एक मान है जो एक वैध मेमोरी एड्रेस और संख्यात्मक सीमा के अंदर है जिसे प्रोसेसर संबोधित करने में सक्षम है।

इतिहास

1955 में, सोवियत कंप्यूटर वैज्ञानिक कतेरीना युशचेंको ने एड्रेस प्रोग्रामिंग भाषा का आविष्कार किया, जिसने अप्रत्यक्ष एड्रेसिंग और उच्चतम सीमा के एड्रेस - पॉइंटर्स के अनुरूप संभव बनाया। सोवियत संघ के कंप्यूटरों पर इस भाषा का व्यापक रूप से उपयोग किया जाता था। हालांकि, यह सोवियत संघ के बाहर अज्ञात था और सामान्य रूप से हेरोल्ड लॉसन को 1964 में पॉइंटर के आविष्कार का श्रेय दिया जाता है।[2] 2000 में लॉसन को इंस्टीट्यूट ऑफ़ इलेक्ट्रिकल एंड इलेक्ट्रॉनिक्स इंजीनियर्स द्वारा कंप्यूटर पायनियर अवार्ड प्रदान किया गया था "[f] या पॉइंटर वेरिएबल का आविष्कार करना और इस अवधारणा को प्रोग्रामिंग भाषा/आई में प्रस्तुत करना इस प्रकार पहली बार एक सामान्य-उद्देश्य उच्च-स्तर भाषा में लिंक्ड सूचियों को नमनीय रूप से गतिविधि करने की क्षमता प्रदान करना"।[3] अवधारणाओं पर उनका सेमिनल पेपर सेंट्रल अमेरिकन कॉमन मार्केट मे जून 1967 के अंक में प्रोग्रामिंग भाषा/आई सूची प्रोसेसिंग के नाम से प्रकाशित हुआ। ऑक्सफोर्ड इंग्लिश डिक्शनरी के अनुसार, 'पॉइंटर' शब्द पहली बार प्रणाली विकास निगम द्वारा एक तकनीकी ज्ञापन में पॉइंटर शब्द पहली बार स्टैक पॉइंटर के रूप में प्रिंट में दिखाई दिया।

औपचारिक विवरण

कंप्यूटर विज्ञान में, एक पॉइन्टर एक प्रकार का संदर्भ (कंप्यूटर विज्ञान) है।

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

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

इन परिभाषाओं के संदर्भ में, एक बाइट सबसे छोटा प्रिमिटिव है; प्रत्येक मेमोरी एड्रैस एक अलग बाइट निर्दिष्ट करता है। किसी डेटा के प्रारम्भिक बाइट का मेमोरी एड्रेस पूरे डेटा का मेमोरी एड्रेस (या बेस मेमोरी एड्रेस) माना जाता है।

एक मेमोरी पॉइंटर (या सिर्फ पॉइंटर) एक प्रिमिटिव है, जिसका मान मेमोरी एड्रेस के रूप में उपयोग करने के लिए अभिप्रेत है; ऐसा कहा जाता है कि एक पॉइन्टर मेमोरी एड्रैस को इंगित करता है। यह भी कहा जाता है कि एक पॉइंटर डेटा [मेमोरी में] की ओर संकेत करता है जब पॉइंटर का मान डेटा का मेमोरी एड्रेस होता है।

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

संदर्भ संकेत के स्तर के रूप में कार्य करते हैं: एक पॉइन्टर का मान निर्धारित करता है कि गणना में कौन सा मेमोरी एड्रैस (अर्थात, कौन सा डेटा) उपयोग किया जाना है। क्योंकि अप्रत्यक्ष एल्गोरिदम का एक मूलभूत स्वरूप है, पॉइंटर्स को प्रायः प्रोग्रामिंग भाषाओं में एक मौलिक डेटा प्रकार के रूप में व्यक्त किया जाता है; सांख्यिकीय रूप से (या दृढ़ता से) टाइप की गई प्रोग्रामिंग भाषाओं में, पॉइंटर का प्रकार उस डेटा के प्रकार को निर्धारित करता है जिस पर पॉइंटर इंगित करता है।

संरचना आधार

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

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

दूसरी ओर, कुछ प्रणालियों में एड्रैस की तुलना में मेमोरी की अधिक इकाइयाँ होती हैं। इस स्थिति में, एक अधिक जटिल योजना जैसे मेमोरी विभाजन या पेजिंग को अलग-अलग समय पर मेमोरी के विभिन्न भागों का उपयोग करने के लिए नियोजित किया जाता है। x86 संरचना के अंतिम स्वरूप भौतिक मेमोरी एड्रैस के 36 बिट्स तक का समर्थन करते हैं, जिन्हें भौतिक एड्रैस एक्सटेंशन पेजिंग तंत्र के माध्यम से 32-बिट रैखिक एड्रैस स्थान पर मैप किया गया था। इस प्रकार, एक समय में संभावित कुल मेमोरी का केवल 1/16 ही अभिगम्य किया जा सकता है। उसी कंप्यूटर परिवार में एक और उदाहरण इंटेल 80286 प्रोसेसर का 16-बिट संरक्षित मोड था, जो हालांकि केवल 16 एमबी भौतिक मेमोरी का समर्थन करता था, 1 गीगाबाइट तक वर्चुअल मेमोरी तक पहुंच सकता था, लेकिन 16-बिट एड्रेस का संयोजन और सेगमेंट रजिस्टरों ने एक डेटा संरचना में 64 किलोबाइट से अधिक अभिगम्य करना जटिल बना दिया है।

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

उपयोग करता है

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

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

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

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

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

C पॉइंटर्स

पॉइंटर को परिभाषित करने के लिए मूल सिंटेक्स (प्रोग्रामिंग भाषाएं) है:[4]

int *ptr;

यह ptr को निम्न प्रकार की वस्तु के पहचानकर्ता के रूप में घोषित करता है:

  • पॉइन्टर जो intप्रकार की वस्तु को इंगित करता है

यह सामान्य रूप से अधिक संक्षेप में कहा जाता है क्योंकि ptr intका पॉइन्टर है

चूंकि C भाषा स्वत: भंडारण अवधि की वस्तुओं के लिए एक अंतर्निहित प्रारंभिकरण निर्दिष्ट नहीं करती है,[5] प्रायः यह सुनिश्चित करने के लिए देखभाल की जानी चाहिए कि जिस एड्रैस पर ptr अंक मान्य है; यही कारण है कि कभी-कभी यह सुझाव दिया जाता है कि एक पॉइन्टर को शून्य पॉइन्टर मान के लिए स्पष्ट रूप से प्रारंभ किया जाना चाहिए, जो परंपरागत रूप से C मानकीकृत मैक्रो के साथ NULLके साथ निर्दिष्ट किया गया है:[6]

int *ptr = NULL;

C में एक अशक्त पॉइन्टर को डिफ्रेंस करने से अपरिभाषित व्यवहार उत्पन्न होता है,[7] जो विनाशकारी हो सकता है। हालाँकि, अधिकांश कार्यान्वयन[citation needed] सामान्य रूप से सेगमेंटेशन दोष के साथ, विचाराधीन प्रोग्राम के निष्पादन को रोकते है।

हालाँकि, पॉइंटर्स को आरंभ करना अनावश्यक रूप से प्रोग्राम विश्लेषण में प्रतिबाधित कर सकता है, जिससे बग छिप जाते हैं।

किसी भी स्थिति में, एक बार पॉइन्टर घोषित होने के बाद, अगला तार्किक चरण इसके लिए कुछ इंगित करना है:

int a = 5;
int *ptr = NULL;

ptr = &a;

यह a को ptrके एड्रैस का मान निर्दिष्ट करता है उदाहरण के लिए, यदि a को 0x8130 के मेमोरी स्थान पर संग्रहीत किया जाता है, तो समनुदेशन के बाद ptr का मान 0x8130 होगा। पॉइंटर को डिरेफेरेंस करने के लिए, एक तारांकन (अस्ट्रिस्क) चिह्न का पुनः उपयोग किया जाता है:

*ptr = 8;

इसका तात्पर्य है कि ptr (जो 0x8130 है) की सामग्री लें, उस एड्रैस को मेमोरी में जाँचे और उसका मान 8 पर स्थापित करें। यदि a बाद में पुनः अभिगम्य किया जाता है, इसका नया मान 8 होगा।

यदि मेमोरी की प्रत्यक्ष जाँच की जाए तो यह उदाहरण अधिक स्पष्ट हो सकता है। ये मान लीजिए a मेमोरी में एड्रैस 0x8130 पर स्थित है और ptr 0x8134 पर; यह भी मान लें कि यह 32-बिट मशीन है जैसे कि int 32-बिट चौड़ा है। निम्नलिखित कोड स्निपेट निष्पादित होने के बाद मेमोरी में क्या होगा:

int a = 5;
int *ptr = NULL;
एड्रैस सामग्री
0x8130 0x00000005
0x8134 0x00000000

(यहां दिखाया गया NULL पॉइंटर 0x00000000 है।) a को ptrका पता निर्दिष्ट करके:

 ptr = &a;


निम्नलिखित मेमोरी मान उत्पन्न करता है:

एड्रैस सामग्री
0x8130 0x00000005
0x8134 0x00008130

फिर कोडिंग द्वारा ptr को डिफ्रेंसिंग करके:

 *ptr = 8;


कंप्यूटर ptr (जो 0x8130 है), उस एड्रैस को 'जांच करे', और उस स्थान पर 8 निर्दिष्ट करें जो निम्नलिखित मेमोरी प्रदान करता है:

एड्रैस सामग्री
0x8130 0x00000008
0x8134 0x00008130

स्पष्ट रूप से, a से तक अभिगम्य से 8 का मान निकलेगा क्योंकि पिछले निर्देश ने a पॉइन्टर के माध्यम से ptrकी सामग्री को संशोधित किया था।

डेटा संरचनाओं में प्रयोग

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

सापेक्ष एड्रैस आभासी मेमोरी सेगमेंटेशन का एक रूप हैं, और इसके कई लाभ और दोष साझा करते हैं। एक दो-बाइट ऑफ़सेट, जिसमें एक 16-बिट, अहस्ताक्षरित पूर्णांक होता है, का उपयोग 64 किलोबाइट (216 बाइट्स) तक सापेक्ष एड्रैस प्रदान करने के लिए किया जा सकता है एक डेटा संरचना की। इसे आसानी से 128, 256 या 512 कीवीबाइट तक बढ़ाया जा सकता है यदि इंगित किए गए एड्रैस को आधे-शब्द, शब्द या दोहरे-शब्द सीमा पर डेटा संरचना संरेखण के लिए अनिवार्य किया जाता है (लेकिन, एक अतिरिक्त शिफ्ट बाएं बिटवाइज़ संचालन की आवश्यकता होती है - 1 तक, 2 या 3 बिट्स - ऑफसेट को 2, 4 या 8 के एक कारक द्वारा समायोजित करने के लिए, इसके अतिरिक्त बेस एड्रैस से पहले)। सामान्य रूप से, हालांकि, ऐसी योजनाएं बहुत संचारित होती हैं, और प्रोग्रामर की सुविधा के लिए पूर्ण एड्रैस (और अंतर्निहित, एक फ्लैट एड्रैस स्थान) को प्राथमिकता दी जाती है।

एक बाइट ऑफ़सेट, जैसे किसी वर्ण का हेक्साडेसिमल सूचना विनिमय के लिए अमेरिकी मानक कोड मान (उदाहरण X'29') का उपयोग किसी सरणी में वैकल्पिक पूर्णांक मान (या अनुक्रमणिका) को इंगित करने के लिए किया जा सकता है (उदाहरण, X'01'). इस तरह, वर्णों को ' मूल एवं प्रारम्भिक तथ्य' से प्रयोग करने योग्य अनुक्रमिक सरणी डेटा संरचना में और फिर लुकअप सारणी के बिना एक पूर्ण एड्रैस पर बहुत कुशलता से अनुवादित किया जा सकता है।

C सरणियाँ

C में, पॉइन्टर अंकगणितीय के संदर्भ में सरणी अनुक्रमण औपचारिक रूप से परिभाषित किया गया है; अर्थात्, भाषा विनिर्देश के लिए इसकी आवश्यकता है कि array[i] के *(array + i)समान हो।[8] इस प्रकार C में, सरणियों को मेमोरी के निरंतर क्षेत्रों के संकेत के रूप में माना जा सकता है (बिना अंतराल के),[8]और सरणियों तक पहुँचने के लिए सिंटैक्स उसके लिए समान है जिसका उपयोग पॉइंटर्स को हटाने के लिए किया जा सकता है। उदाहरण के लिए, एक array निम्नलिखित तरीके से घोषित और उपयोग किया जा सकता है:

int array[5]; /* Declares 5 contiguous integers */
int *ptr = array; /* Arrays can be used as pointers */
ptr[0] = 1; /* Pointers can be indexed with array syntax */
*(array + 1) = 2; /* Arrays can be dereferenced with pointer syntax */
*(1 + array) = 2; /* Pointer addition is commutative */
2[array] = 4; /* Subscript operator is commutative */

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

जबकि सरणियों और पॉइंटर्स पर अधिकांश ऑपरेटर समतुल्य हैं, sizeof ऑपरेटर का परिणाम भिन्न होता है। इस उदाहरण में, sizeof(array) 5*sizeof(int) (सरणी का आकार) का मूल्यांकन करेगा, जबकि sizeof(ptr) पॉइंटर के आकार, sizeof(int*)का मूल्यांकन करेगा।

किसी सरणी के डिफ़ॉल्ट मानों को इस प्रकार घोषित किया जा सकता है:

int array[5] = {2, 4, 3, 1, 5};

यदि array 32-बिट छोटी-एंडियन मशीन पर एड्रैस 0x1000 से प्रारंभ होने वाली मेमोरी में स्थित है, तो मेमोरी में निम्नलिखित सम्मिलित होंगे (मान हेक्साडेसिमल में हैं, जैसे एड्रैस):

0 1 2 3
1000 2 0 0 0
1004 4 0 0 0
1008 3 0 0 0
100C 1 0 0 0
1010 5 0 0 0

यहां प्रस्तुत पांच पूर्णांक 2, 4, 3, 1, और 5 हैं। ये पांच पूर्णांक 32 बिट्स (4 बाइट्स) पर प्रग्रहण कर लेते हैं, जिनमें से प्रत्येक सबसे कम-महत्वपूर्ण बाइट पहले संग्रहीत होता है (यह एक छोटा-एंडियन सेंट्रल प्रोसेसिंग यूनिट संरचना है) और निरंतर संग्रहीत किया जाता है और एड्रैस 0x1000 से प्रारंभ है।

पॉइंटर्स के साथ C का सिंटैक्स है:

  • array तात्पर्य 0x1000;
  • array + 1 तात्पर्य 0x1004: + 1 का तात्पर्य int, के आकार को जोड़ना है, जो 4 बाइट्स है
  • *array का तात्पर्य है arrayकी सामग्री को हटाना है। मेमोरी एड्रैस (0x1000) के रूप में सामग्री को ध्यान में रखते हुए, उस स्थान पर (0x0002) मान देखें;
  • array[i] तात्पर्य तत्व संख्या i, 0-आधारित, array का है, जिसका अनुवाद *(array + i) मेकिया गया है।

अंतिम उदाहरण यह है कि array की सामग्री का उपयोग कैसे किया जाएइसे तोड़ना:

  • array + i (i) वें arrayकी मेमोरी लोकेशन है i=0 से प्रारंभ होता है;
  • *(array + i) उस मेमोरी एड्रेस को लेता है और मान को अभिगम्य करने के लिए इसे संदर्भित करता है।

C से लिंक की गई सूची

नीचे C में लिंक की गई सूची की एक उदाहरण परिभाषा दी गई है।

/* the empty linked list is represented by NULL
 * or some other sentinel value */
#define EMPTY_LIST NULL

struct link {
 void *data; /* data of this link */
 struct link *next; /* next link; EMPTY_LIST if there is none */
};

यह पॉइन्टर-पुनरावर्ती परिभाषा अनिवार्य रूप से हास्केल (प्रोग्रामिंग भाषा) से संदर्भ-पुनरावर्ती परिभाषा के समान है:

 data Link a = Nil
 | Cons a (Link a)

Nil रिक्त सूची है, और Cons a (Link a) टाइप a का एक कॉन्स सेल है जिसमें एक अन्य लिंक भी टाइप aका है।

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

पॉइंटर्स का उपयोग करके एड्रेस देना

पॉइंटर्स का उपयोग वेरिएबल्स को उनके एड्रैस से पास करने के लिए किया जा सकता है, जिससे उनका मान बदला जा सकता है। उदाहरण के लिए, निम्नलिखित C (प्रोग्रामिंग भाषा) कोड पर विचार करें:

/* a copy of the int n can be changed within the function without affecting the calling code */
void passByValue(int n) {
 n = 12;
}

/* a pointer m is passed instead. No copy of the value pointed to by m is created */
void passByAddress(int *m) {
 *m = 14;
}

int main(void) {
 int x = 3;

 /* pass a copy of x's value as the argument */
 passByValue(x);
 // the value was changed inside the function, but x is still 3 from here on

 /* pass x's address as the argument */
 passByAddress(&x);
 // x was actually changed by the function and is now equal to 14 here

 return 0;
}

गतिशील मेमोरी आवंटन

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

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

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

/* Parts inventory item */
struct Item {
 int id; /* Part number */
 char * name; /* Part name */
 float cost; /* Cost */
};

/* Allocate and initialize a new Item object */
struct Item * make_item(const char *name) {
 struct Item * item;

 /* Allocate a block of memory for a new Item object */
 item = malloc(sizeof(struct Item));
 if (item == NULL)
 return NULL;

 /* Initialize the members of the new Item */
 memset(item, 0, sizeof(struct Item));
 item->id = -1;
 item->name = NULL;
 item->cost = 0.0;

 /* Save a copy of the name in the new Item */
 item->name = malloc(strlen(name) + 1);
 if (item->name == NULL) {
 free(item);
 return NULL;
 }
 strcpy(item->name, name);

 /* Return the newly created Item object */
 return item;
}

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

/* Deallocate an Item object */
void destroy_item(struct Item *item) {
 /* Check for a null object pointer */
 if (item == NULL)
 return;

 /* Deallocate the name string saved within the Item */
 if (item->namem!= NULL) {
 free(item->name);
 item->name = NULL;
 }

 /* Deallocate the Item object itself */
 free(item);
}

मेमोरी-मैप किया गया हार्डवेयर

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

माइक्रोकंट्रोलर्स की प्रोग्रामिंग करते समय पॉइंटर्स को एड्रेस निर्दिष्ट करना एक अमूल्य उपकरण है। नीचे एक सामान्य उदाहरण है जो एक प्रकार के int के पॉइन्टर को घोषित करता है और इसे हेक्साडेसिमल एड्रैस पर प्रारंभ करता है, इस उदाहरण में निरंतर 0x7FFF:

int *hardware_address = (int *)0x7FFF;

80 के दशक के मध्य में, पर्सनल कंप्यूटर की वीडियो क्षमताओं तक पहुँचने के लिएबेसिक इनपुट/आउटपुट सिस्टम का उपयोग मंद था। प्रदर्शन-गहन अनुप्रयोग सामान्य रूप से हेक्साडेसिमल स्थिर 0xB8000 को 80 अहस्ताक्षरित 16-बिट int मानों की एक सरणी के लिए पॉइंटर में निर्धारित करके प्रत्यक्ष रूप से रंग ग्राफिक्स एडेप्टर वीडियो मेमोरी तक पहुंचने के लिए उपयोग किया जाता है। प्रत्येक मान में निम्न बाइट में एक सूचना विनिमय के लिए अमेरिकी मानक कोड और उच्च बाइट में एक रंग सम्मिलित होता है। इस प्रकार, अक्षर 'A' को पंक्ति 5 में, कॉलम 2 को नीले रंग पर चमकीले सफेद रंग में रखने के लिए, निम्नलिखित कोड की तरह लिखा जाएगा:

#define VID ((unsigned short (*)[80])0xB8000)

void foo(void) {
 VID[4][1] = 0x1F00 | 'A';
}

नियंत्रण तालिकाओं में प्रयोग करें

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

टाइप किए गए पॉइंटर्स और कास्टिंग ( प्रक्षेप)

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

उदाहरण के लिए, C में

int *money;
char *bags;

money एक पूर्णांक पॉइन्टर होगा और bags एक चार पॉइन्टर होगा। निम्नलिखित जीएनयू कंपाइलर संग्रह के अंतर्गत असंगत पॉइन्टर प्रकार से समनुदेशन की एक कंपाइलर चेतावनी उत्पन्न करेगा

bags = money;

क्योंकि money और bags विभिन्न प्रकारों के साथ घोषित किए गए थे। कंपाइलर चेतावनी को दबाने के लिए, यह स्पष्ट किया जाना चाहिए कि आप वास्तव में टाइप रूपांतरण द्वारा समनुदेशन करना चाहते हैं

bags = (char *)money;

जो पूर्णांक पॉइन्टर को money निर्दिष्ट करने और bagsको निर्दिष्ट करने के लिए कहता है।

C मानक के 2005 के एक प्रारूप के लिए आवश्यक है कि एक प्रकार से दूसरे प्रकार से प्राप्त पॉइन्टर को कास्टिंग करने से दोनों प्रकारों के लिए संरेखण शुद्धता बनाए रखनी चाहिए (6.3.2.3 पॉइंटर्स, पैरा। 7):[9]

char *external_buffer = "abcdef";
int *internal_data;

internal_data = (int *)external_buffer; // UNDEFINED BEHAVIOUR if "the resulting pointer
                                         // is not correctly aligned"

उन भाषाओं में जो पॉइंटर अंकगणित की स्वीकृति देती हैं, पॉइंटर्स पर अंकगणित प्रकार के आकार को ध्यान में रखता है। उदाहरण के लिए, एक पॉइंटर में एक पूर्णांक संख्या जोड़ने से एक और पॉइंटर उत्पन्न होता है जो उस एड्रैस की ओर संकेत करता है जो उस संख्या के प्रकार के आकार से अधिक होता है। यह हमें किसी दिए गए प्रकार की सरणी के तत्वों के एड्रैस की आसानी से गणना करने की स्वीकृति देता है, जैसा ऊपर C सरणी उदाहरण में दिखाया गया था। जब एक प्रकार के पॉइंटर को दूसरे प्रकार के भिन्न आकार में निर्दिष्ट किया जाता है, तो प्रोग्रामर को यह उपेक्षा करनी चाहिए कि पॉइंटर अंकगणित की अलग-अलग गणना की जाएगी। C में, उदाहरण के लिए, यदि money सरणी 0x2000 से प्रारंभ होती है और sizeof(int) 4 बाइट है जबकि sizeof(char) 1 बाइट है, तो money + 1 0x2004 को इंगित करेगा, लेकिन bags + 1 0x2001 को इंगित करेगा। कास्टिंग के अन्य जोखिमों में डेटा की हानि सम्मिलित है जब विस्तृत डेटा संकीर्ण स्थानों पर लिखा जाता है (उदाहरण bags[0] = 65537;), अनपेक्षित परिणाम जब बिट-शिफ्टिंग मान, और तुलना समस्याएं, विशेष रूप से हस्ताक्षरित बनाम अहस्ताक्षरित मूल्यों के साथ होती है।

हालांकि संकलन-समय पर सामान्य रूप से यह निर्धारित करना असंभव है कि कौन C कास्ट सुरक्षित है, कुछ भाषाएँ रन-टाइम प्रकार की जानकारी संग्रहीत करती हैं जिनका उपयोग यह पुष्टि करने के लिए किया जा सकता है कि ये जोखिमयुक्त कास्ट रनटाइम पर मान्य हैं। अन्य भाषाएँ केवल सुरक्षित कास्ट के एक संरक्षी अनुमान को स्वीकार करती हैं, या कोई भी नहीं।

पॉइंटर्स का मूल्य

C और C ++ में, तथापि दो पॉइंटर्स समान के रूप में तुलना करें, इसका तात्पर्य यह नहीं है कि वे समकक्ष हैं। इन भाषाओं और एलएलवीएम में, नियम की व्याख्या इस अर्थ में की जाती है कि सिर्फ इसलिए कि दो पॉइंटर्स एक ही एड्रैस की ओर संकेत करते हैं, इसका तात्पर्य यह नहीं है कि वे इस अर्थ में समान हैं कि उन्हें एक दूसरे के स्थान पर उपयोग किया जा सकता है, पॉइंटर्स के बीच के अंतर को उनके उद्गम के रूप में संदर्भित किया जाता है।[10] एक पूर्णांक प्रकार जैसे कि कास्टिंग करना uintptr_t कार्यान्वयन-परिभाषित है और यह जो तुलना प्रदान करता है वह इस बारे में अधिक जानकारी प्रदान नहीं करता है कि क्या दो पॉइंटर्स विनिमेय हैं। इसके अतिरिक्त, बाइट्स और अंकगणित में आगे रूपांतरण पॉइंटर्स के उपयोग को ट्रैक करने की प्रयास कर रहे ऑप्टिमाइज़र को मुक्त कर देगा, एक समस्या अभी भी अकादमिक शोध में स्पष्ट है।[11]


पॉइंटर्स को सुरक्षित बनाना

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

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

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

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

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

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

मूल्य द्वारा परिभाषित प्रकार

अशक्त पॉइन्टर

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

डांगलिंग पॉइन्टर

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

निम्न उदाहरण कोड डांगलिंग पॉइन्टर को दिखाता है:

int func(void) {
 char *p1 = malloc(sizeof(char)); /* (undefined) value of some place on the heap */
 char *p2; /* dangling (uninitialized) pointer */
 *p1 = 'a'; /* This is OK, assuming malloc() has not returned NULL. */
 *p2 = 'b'; /* This invokes undefined behavior */
}

यहाँ, p2 मेमोरी में कहीं भी इंगित कर सकता है, इसलिए समनुदेशन *p2 = 'b'; कर रहा है, मेमोरी के अज्ञात क्षेत्र को नष्ट कर सकता है या विभाजन दोष को ट्रिगर कर सकता है।

वाइल्ड ब्रांच

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

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

उपयोग या डेटाटाइप द्वारा परिभाषित प्रकार

ऑटोरिलेटिव (स्वत:सापेक्ष) पॉइंटर

एक ऑटोरिलेटिव पॉइंटर एक पॉइंटर होता है जिसका मान पॉइंटर के एड्रैस से ऑफ़सेट के रूप में व्याख्या किया जाता है; इस प्रकार, यदि डेटा संरचना में एक ऑटोरिलेटिव पॉइंटर सदस्य है जो डेटा संरचना के कुछ भाग को इंगित करता है, तो डेटा संरचना को ऑटो रिलेटिव पॉइंटर के मान को अपडेट किए बिना मेमोरी में स्थानांतरित किया जा सकता है।[12]

उद्धृत पेटेंट एक ही वस्तु का अर्थ करने के लिए स्व-सापेक्ष पॉइन्टर शब्द का भी उपयोग करता है। हालाँकि, उस शब्द का अर्थ अन्य तरीकों से उपयोग किया गया है:

  • पॉइन्टर के एड्रैस के अतिरिक्त संरचना के एड्रैस से ऑफ़सेट का तात्पर्य;[citation needed]
  • तात्पर्य एक पॉइन्टर जिसमें अपना एड्रैस होता है, जो मेमोरी के किसी भी एकपक्षीय क्षेत्र में पुनर्निर्माण के लिए उपयोगी हो सकता है जो एक दूसरे को इंगित करने वाले डेटा संरचनाओं का संग्रह होता है।[13]


आधारित पॉइन्टर

एक आधारित पॉइंटर एक पॉइंटर होता है जिसका मान दूसरे पॉइंटर के मान से ऑफ़सेट होता है। इसका उपयोग डेटा के ब्लॉक को संग्रहित और लोड करने के लिए किया जा सकता है, ब्लॉक की प्रारंभ के एड्रैस को बेस पॉइंटर को निर्दिष्ट कर सकता है।[14]

संरचना द्वारा परिभाषित प्रकार

एकाधिक संकेत

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

struct element {
 struct element *next;
 int value;
};

struct element *head = NULL;

यह कार्यान्वयन पूरी सूची के लिए प्रतिनिधि के रूप में सूची में पहले तत्व के लिए पॉइन्टर का उपयोग करता है। यदि सूची के आरंभ में एक नया मान जोड़ा जाता है, तब नए तत्व को इंगित करने के लिए head को बदलना होगा। चूंकि C तर्क सदैव मूल्य से पारित होते हैं, दोहरे संकेत का उपयोग करके सम्मिलन को सही रूप से कार्यान्वित करने की स्वीकृति मिलती है, और सूची के सामने सम्मिलन से सम्पर्क के लिए विशेष केस कोड को समाप्त करने का वांछनीय दुष्प्रभाव होता है:

// Given a sorted list at *head, insert the element item at the first
// location where all earlier elements have lesser or equal value.
void insert(struct element **head, struct element *item) {
 struct element **p; // p points to a pointer to an element
 for (p = head; *p;!= NULL; p = &(*p)->next) {
 if (item->value <= (*p)->value)
 break;
 }
 item->next = *p;
 *p = item;
}

// Caller does this:
insert(&head, item);

इस स्थिति में, यदि का मान item से कम है head, फोन करने वाले का head नए आइटम के एड्रैस पर परिशुद्ध रूप से अपडेट किया गया है।

एक मूल उदाहरण C (और C++) में मुख्य फ़ंक्शन के argv तर्क में है, जो प्रोटोटाइप में char **argv—के रूप में दिया गया है - ऐसा इसलिए है क्योंकि वेरिएबल argv स्वयं स्ट्रिंग्स की एक सरणी के लिए एक पॉइन्टर है (एक सरणी की सरणियाँ), इसलिए *argv 0 वीं स्ट्रिंग के लिए एक पॉइन्टर है (कन्वेंशन द्वारा प्रोग्राम का नाम), और **argv 0वीं स्ट्रिंग का 0वां वर्ण है।

फंक्शन पॉइंटर

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

int sum(int n1, int n2) { // Function with two integer parameters returning an integer value
 return n1 + n2;
}

int main(void) {
 int a, b, x, y;
 int (*fp)(int, int); // Function pointer which can point to a function like sum
 fp = &sum; // fp now points to function sum
 x = (*fp)(a, b); // Calls function sum with arguments a and b
 y = sum(a, b); // Calls function sum with arguments a and b
}

बैक पॉइंटर

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

एक सरणी अनुक्रमणिका का उपयोग कर सिमुलेशन

एक (सामान्य रूप से एक-आयामी) सरणी के सूचकांक का उपयोग करके पॉइन्टर गतिविधि को अनुकरण करना संभव है।

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

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

विभिन्न प्रोग्रामिंग भाषाओं में समर्थन

एडीए

एडीए (प्रोग्रामिंग भाषा) एक दृढ़ता से टाइप की जाने वाली भाषा है जहां सभी पॉइंटर्स टाइप किए जाते हैं और केवल सुरक्षित प्रकार के रूपांतरणों की स्वीकृति है। डिफ़ॉल्ट रूप से सभी पॉइंटर्स को इनिशियलाइज़ (आरंभीकृत) किया जाता है null, और डेटा तक अभिगम्य का कोई भी प्रयास a null पॉइन्टर एक्सेप्शन हैंडलिंग को किए जाने का कारण बनता है। एडीए में पॉइंटर्स को पहुंच प्रकार कहा जाता है। एडीए 83 ने अभिगम्य प्रकारों पर अंकगणित की स्वीकृति नहीं दी (हालाँकि कई कंपाइलर विक्रेता इसके लिए एक गैर-मानक विशेषता के रूप में प्रदान करते हैं), लेकिन एडीए 95 पैकेज System.Storage_Elementsके माध्यम से अभिगम्य प्रकारों पर "सुरक्षित" अंकगणित का समर्थन करता है

प्रारम्भिक सर्व-उद्देश्यीय प्रतीकात्मक निर्देश कोड

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

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

dim as integer f = 257
dim as any ptr g = @f
dim as integer ptr i = g
assert(*i = 257)
assert( (g + 4) = (@f + 1) )

C और C ++

C (प्रोग्रामिंग भाषा) और C++ पॉइंटर्स वेरिएबल्स हैं जो एड्रैस को संग्रहित करते हैं और शून्य हो सकते हैं। प्रत्येक पॉइन्टर के पास एक प्रकार होता है जिसे वह इंगित करता है, लेकिन कोई पॉइन्टर प्रकारों के बीच स्वतंत्र रूप से कास्ट कर सकता है (लेकिन फ़ंक्शन पॉइंटर और ऑब्जेक्ट पॉइंटर के बीच नहीं)। एक विशेष पॉइन्टर प्रकार जिसे "शून्य पॉइन्टर" कहा जाता है, किसी भी (गैर-फ़ंक्शन) ऑब्जेक्ट को इंगित करने की स्वीकृति देता है, लेकिन इस तथ्य से सीमित है कि इसे प्रत्यक्ष रूप से संदर्भित नहीं किया जा सकता है (इसे कास्ट किया जाएगा)। पर्याप्त आकार के एक अभिन्न प्रकार से और उसके लिए एक पॉइन्टर को कास्ट करके एड्रैस ही प्रायः प्रत्यक्ष रूप से कुशलतापूर्वक प्रयोग किया जा सकता है, हालांकि परिणाम कार्यान्वयन-परिभाषित होते हैं और वास्तव में अपरिभाषित गतिविधि का कारण बन सकते हैं; जबकि पहले C मानकों में एक अभिन्न प्रकार नहीं था जो अपेक्षाकृत अधिक बड़ा होने की प्रत्याभूति देता था, C 99 <stdint.h>में परिभाषित uintptr_t typedef नाम निर्दिष्ट करता है, लेकिन एक कार्यान्वयन को इसे प्रदान करने की आवश्यकता नहीं है।

C ++ पूरी तरह से C पॉइंटर्स और C टाइपकास्टिंग का समर्थन करता है। यह संकलन-समय पर कुछ अनपेक्षित जोखिमयुक्त विक्षेप को प्रग्रहण में सहायता करने के लिए टाइपकास्टिंग ऑपरेटरों के एक नए समूह का भी समर्थन करता है। C++11 के बाद से, C++ मानक लाइब्रेरी स्मार्ट पॉइंटर्स भी प्रदान करता है (unique_ptr, shared_ptr और weak_ptr) जिसका उपयोग कुछ स्थितियों में स्थिति C पॉइंटर्स के सुरक्षित विकल्प के रूप में किया जा सकता है। C++ संदर्भ के दूसरे रूप का भी समर्थन करता है, जो पॉइन्टर से अपेक्षाकृत अधिक भिन्न होता है, जिसे केवल एक संदर्भ (C++) या संदर्भ प्रकार कहा जाता है।

'प्वाइंटर अंकगणित', अर्थात, अंकगणितीय संचालन (साथ ही साथ परिमाण तुलना) के साथ एक पॉइन्टर के लक्ष्य एड्रैस को संशोधित करने की क्षमता, भाषा मानक द्वारा एकल सरणी वस्तु (या उसके ठीक बाद) की सीमा के अंदर रहने के लिए प्रतिबंधित है। और अन्यथा अपरिभाषित गतिविधि का उपयोग करेगा। एक पॉइन्टर से जोड़ना या घटाना इसे अपने डेटाटाइप के आकार के एक से अधिक द्वारा ले जाता है। उदाहरण के लिए, 4-बाइट पूर्णांक मानों में एक पॉइंटर में 1 जोड़ने से पॉइंटर के पॉइंट-से-बाइट-एड्रेस में 4 की वृद्धि होगी। इसका प्रभाव पूर्णांकों की एक सन्निहित सरणी में अगले तत्व को इंगित करने के लिए पॉइंटर को बढ़ाने का प्रभाव है जो प्रायः नियत परिणाम है। पॉइन्टर void पॉइंटर्स अंकगणित पर नहीं किया जा सकता है क्योंकि शून्य प्रारूप का कोई आकार नहीं है, और इस प्रकार इंगित एड्रैस जोड़ा नहीं जा सकता है, हालांकि जीएनयू कंपाइलर संग्रह और अन्य कंपाइलर void* बाइट अंकगणितीय प्रदर्शन करेंगे एक गैर-मानक एक्सटेंशन के रूप में निष्पादित करेंगे इसे इस तरह मानते हैं यह char *थे।

पॉइंटर अंकगणित प्रोग्रामर को विभिन्न प्रकारों से सम्पर्क का एक ही तरीका प्रदान करता है: बाइट्स में वास्तविक ऑफ़सेट के अतिरिक्त आवश्यक तत्वों की संख्या को जोड़ना और घटाना। (पॉइन्टर अंकगणित के साथ char * पॉइंटर्स बाइट ऑफ़सेट का उपयोग करते हैं, क्योंकि sizeof(char) परिभाषा के अनुसार 1 है।) विशेष रूप से, C परिभाषा स्पष्ट रूप से सिंटैक्स की घोषणा करती है a[n], जो कि n- सरणी का तत्व a, के समान है *(a + n), जो कि a + nद्वारा इंगित तत्व की सामग्री है। इसका अर्थ यह है कि n[a] a[n]के समान है और कोई लिख सकता है, उदाहरण के लिए, a[3] या 3[a] किसी सरणी के चौथे तत्व aतक पहुँचने के लिए समान रूप से अच्छा है।

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

void पॉइन्टर, याvoid*, अमेरिकन राष्ट्रीय मानक संस्थान C और C ++ में एक सामान्य पॉइन्टर प्रकार के रूप में समर्थित है। के लिए एक पॉइंटर void किसी भी ऑब्जेक्ट (फ़ंक्शन नहीं) के एड्रैस को संग्रहित कर सकता है, और, C में, समनुदेशन पर किसी अन्य ऑब्जेक्ट पॉइंटर प्रकार में अंतर्निहित रूप से परिवर्तित हो जाता है, लेकिन इसे संदर्भित होने पर स्पष्ट रूप से निर्धारित किया जाना चाहिए। K&R C प्रोग्रामिंग भाषा ने "टाइप-एग्नोस्टिक पॉइंटर" उद्देश्य (अमेरिकन राष्ट्रीय मानक संस्थान C से पहले) के लिए वेरिएबल char* का उपयोग किया।

int x = 4;
void* p1 = &x;
int* p2 = p1; // void* implicitly converted to int*: valid C, but not C++
int a = *p2;
int b = *(int*)p1; // when dereferencing inline, there is no implicit conversion

C ++ असाइनमेंट में भी void* के अन्य पॉइन्टर प्रकारों के अंतर्निहित रूपांतरण की स्वीकृति नहीं देता है। यह कम और यहां तक ​​कि अनपेक्षित कास्ट से बचने के लिए एक डिजाइन निर्णय था, हालांकि अधिकांश कंपाइलर अन्य कास्ट का सामना करते समय त्रुटियों की चेतावनी नहीं देते हैं।

int x = 4;
void* p1 = &x;
int* p2 = p1;                     // this fails in C++: there is no implicit conversion from void*
int* p3 = (int*)p1; // C-style cast
int* p4 = reinterpret_cast<int*>(p1); // C++ cast

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

पॉइंटर-से-मेंबर (सदस्य)

C ++ पॉइंटर्स में कक्षा के गैर स्थिर सदस्यों को परिभाषित किया जा सकता है। यदि कोई क्लास C एक सदस्य T a है तब &C::a प्रकार T C::*.के सदस्य के लिए एक पॉइन्टर है। यह सदस्य ऑब्जेक्ट या फ़ंक्शन पॉइंटर मेथड पॉइंटर्स हो सकता है।[15] उनका उपयोग ऑपरेटरों के दाईं ओर .* और ->* संबंधित सदस्य तक अभिगम्य के लिए किया जा सकता है।

struct S {
int a;
int f() const {return a;}
};
S s1{};
S* ptrS = &s1;

int S::* ptr = &S::a; // pointer to S::a
int (S::* fp)()const = &S::f; // pointer to S::f

s1.*ptr = 1;
std::cout << (s1.*fp)() << "\n"; // prints 1
ptrS->*ptr = 2;
std::cout << (ptrS->*fp)() << "\n"; // prints 2

सूचक घोषणा सिंटैक्स अवलोकन

ये पॉइंटर डिक्लेरेशन (घोषणा) पॉइंटर डिक्लेरेशन के अधिकांश वेरिएंट को सुरक्षा करते हैं। स्वभावतः ट्रिपल पॉइंटर्स होना संभव है, लेकिन ट्रिपल पॉइंटर के पीछे मुख्य सिद्धांत पहले से ही द्विक पॉइंटर में सम्मिलित हैं। g++ या क्लैंग का उपयोग करते समय इनमें से प्रत्येक प्रकार के लिए पद typeid(type).name() के लिए समान होता है।[16][17]

char A5_A5_c [5][5]; /* array of arrays of chars */
char *A5_Pc [5]; /* array of pointers to chars */
char **PPc; /* pointer to pointer to char ("double pointer") */
char (*PA5_c) [5]; /* pointer to array(s) of chars */
char *FPcvE(); /* function which returns a pointer to char(s) */
char (*PFcvE)(); /* pointer to a function which returns a char */
char (*FPA5_cvE())[5]; /* function which returns pointer to an array of chars */
char (*A5_PFcvE[5])(); /* an array of pointers to functions which return a char */

पॉइंटर्स-से-मेंबर से जुड़ी निम्नलिखित घोषणाएँ केवल C ++ में मान्य हैं:

class C;
class D;
char C::* M1Cc; /* pointer-to-member to char */
char C::*A5_M1Cc [5]; /* array of pointers-to-member to char */
char* C::* M1CPc; /* pointer-to-member to pointer to char(s) */
char C::** PM1Cc; /* pointer to pointer-to-member to char */
char (*M1CA5_c) [5]; /* pointer-to-member to array(s) of chars */
char C::* FM1CcvE(); /* function which returns a pointer-to-member to char */
char D::* C::* M1CM1Dc; /* pointer-to-member to pointer-to-member to pointer to char(s) */
char C::* C::* M1CMS_c; /* pointer-to-member to pointer-to-member to pointer to char(s) */
char (C::* FM1CA5_cvE())[5]; /* function which returns pointer-to-member to an array of chars */
char (C::* M1CFcvE)() /* pointer-to-member-function which returns a char */ 


() और [] की *से अधिक प्राथमिकता है।[18]


C#

C # (प्रोग्रामिंग भाषा) में, पॉइंटर्स केवल कुछ शर्तों के अंतर्गत समर्थित होते हैं: पॉइंटर्स सहित कोड के किसी भी ब्लॉक को unsafe कीवर्ड के साथ चिह्नित किया जाना चाहिए। ऐसे ब्लॉकों को चलाने के लिए सामान्य रूप से उच्च सुरक्षा अनुमतियों की आवश्यकता होती है। सिंटैक्स अनिवार्य रूप से C ++ के समान है, और बताया गया एड्रैस या तो प्रबंधित कोड या प्रबंधित कोड मेमोरी हो सकता है। हालाँकि, प्रबंधित मेमोरी के लिए पॉइंटर्स (किसी प्रबंधित ऑब्जेक्ट के लिए कोई पॉइंटर) को fixed कीवर्ड का उपयोग करके घोषित किया जाना चाहिए, जो गारबेज संग्रहण (कंप्यूटर विज्ञान) को मेमोरी प्रबंधन के भाग के रूप में इंगित वस्तु को स्थानांतरित करने से रोकता है, जबकि पॉइन्टर स्कोप (विस्तार) में है, इस प्रकार पॉइन्टर एड्रैस को वैध रखता है।

इसका एक्सेप्शन IntPtr संरचना का उपयोग करने से है, जो int*के समतुल्य एक सुरक्षित प्रबंधित है, और इसके लिए असुरक्षित कोड की आवश्यकता नहीं है। उदाहरण के लिए System.Runtime.InteropServices, से विधियों का उपयोग करते समय इस प्रारूप को प्रायः प्रतिगमित किया जाता है:

// Get 16 bytes of memory from the process's unmanaged memory
IntPtr pointer = System.Runtime.InteropServices.Marshal.AllocHGlobal(16);

// Do something with the allocated memory

// Free the allocated memory
System.Runtime.InteropServices.Marshal.FreeHGlobal(pointer);

नेटवर्क समर्थित तकनीक रूप रेखा में System और System.Runtime.InteropServices नामस्थान (जैसे Marshal क्लास) कई क्लास और विधियाँ सम्मिलित हैं, जो नेटवर्क समर्थित तकनीक प्रकारों और पॉइन्टर (उदाहरण के लिए, System.String) कई प्रबंधित कोड प्रकारों और पॉइंटर्स और (उदाहरण के लिए, LPWSTR या void*को रूपांतरित करते हैं।) प्रबंधित कोड के साथ संचार की स्वीकृति देने के लिए परिवर्तित करते है। इस तरह के अधिकांश तरीकों में अप्रबंधित कोड के समान सुरक्षा स्वीकृति की आवश्यकता होती है, क्योंकि वे मेमोरी में यादृच्छिक स्थानों को प्रभावित कर सकते हैं।

सामान्य व्यवसाय-उन्मुख भाषा

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

प्रत्येक पॉइंट-से-डेटा ऑब्जेक्ट के लिए मेमोरी स्थान सामान्य रूप से बाहरी सबरूटीन CALLस्टेटमेंट्स या एम्बेडेड विस्तारित भाषा निर्माण जैसे EXEC CICSया EXEC SQLस्टेटमेंट्स के माध्यम से गतिशील रूप से आवंटित किया जाता है।

सामान्य व्यवसाय-उन्मुख भाषा के विस्तारित संस्करण USAGE IS POINTER क्लॉज़ के साथ घोषित किए गए पॉइंटर चर भी प्रदान करते हैं। ऐसे पॉइन्टर वेरिएबल के मान SET और SET ADDRESS स्टेटमेंट का उपयोग करके स्थापित और संशोधित किए जाते हैं।

सामान्य व्यवसाय-उन्मुख भाषा के कुछ विस्तारित संस्करण PROCEDURE-POINTER भी प्रदान करते हैं, जो निष्पादन योग्य कोड के एड्रैस को संग्रहीत करने में सक्षम हैं।

प्रोग्रामिंग भाषा/आई

प्रोग्रामिंग भाषा/आई भाषा सभी डेटा प्रकारों (संरचनाओं के संकेत सहित), पुनरावर्तन, कंप्यूटर मल्टीटास्किंग, स्ट्रिंग हैंडलिंग और व्यापक अंतर्निर्मित सबरूटीन्स के लिए पॉइंटर्स के लिए पूर्ण समर्थन प्रदान करती है। प्रोग्रामिंग भाषा/आई अपने समय की प्रोग्रामिंग भाषाओं की तुलना में अपेक्षाकृत अधिक आगे था।[citation needed] प्रोग्रामिंग भाषा/आई पॉइंटर्स टाइप नहीं किए गए हैं, और इसलिए पॉइंटर डीरेफरेंसिंग या समनुदेशन के लिए कोई कास्टिंग आवश्यक नहीं है। पॉइंटर के लिए डिक्लेरेशन सिंटैक्स DECLARE xxx POINTER;, जो xxx नाम के एक पॉइंटर को घोषित करता है। पॉइंटर्स का उपयोगBASED वेरिएबल के साथ किया जाता है। एक आधारित चर को एक डिफ़ॉल्ट लोकेटर के साथ घोषित किया जा सकता है (DECLARE xxx BASED(ppp); या बिना (DECLARE xxx BASED;), जहां xxx एक आधारित वेरिएबल है, जो एक तत्व वेरिएबल, एक संरचना, या एक सरणी हो सकता है, और पीपीपी डिफ़ॉल्ट पॉइन्टर है)। इस तरह के एक वेरिएबल को एक स्पष्ट पॉइन्टर संदर्भ के बिना संबोधित किया जा सकता है (xxx=1;, या डिफ़ॉल्ट लोकेटर (पीपीपी), या किसी अन्य पॉइन्टर (qqq->xxx=1;) के लिए एक स्पष्ट संदर्भ के साथ संबोधित किया जा सकता है।

पॉइंटर अंकगणित प्रोग्रामिंग भाषा/आई मानक का भाग नहीं है, लेकिन कई कंपाइलर ptr = ptr±expressionअभिव्यक्ति के रूप की अभिव्यक्ति की अनुमति देते हैं। अंतर्राष्ट्रीय व्यापार मशीनें निगम प्रोग्रामिंग भाषा/आई में बिल्टिन फ़ंक्शन PTRADD भी है। पॉइंटर अंकगणित सदैव बाइट में किया जाता है।

अंतर्राष्ट्रीय व्यापार मशीनें एंटरप्राइज़ प्रोग्रामिंग भाषा/आई कम्पाइलर के पास टाइप किए गए पॉइंटर का एक नया रूप है जिसे HANDLEकहा जाता है।

डी

डी (प्रोग्रामिंग भाषा) C और C ++ का व्युत्पन्न है जो C पॉइंटर्स और C टाइपकास्टिंग का पूर्ण समर्थन करता है।

एफिल

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

फोरट्रान

फोरट्रान फोरट्रान -90 ने दृढ़ता से टाइप की गई पॉइन्टर क्षमता की प्रारंभ की। फोरट्रान पॉइंटर्स में केवल एक साधारण मेमोरी एड्रेस से अधिक होता है। वे सरणी आयामों की निचली और ऊपरी सीमा, स्ट्राइड्स (उदाहरण के लिए, एकपक्षीय सरणी अनुभागों का समर्थन करने के लिए), और अन्य मेटाडेटा को भी समाहित करते हैं। एक संघ ऑपरेटर, => a का उपयोग POINTER को एक वेरिएबल से जोड़ने के लिए किया जाता है जिसमें TARGET विशेषता होती है। फोरट्रान -90 ALLOCATE स्टेटमेंट का उपयोग पॉइंटर को मेमोरी के ब्लॉक से जोड़ने के लिए भी किया जा सकता है। उदाहरण के लिए, लिंक की गई सूची संरचना को परिभाषित करने और बनाने के लिए निम्न कोड का उपयोग किया जा सकता है:

type real_list_t
 reall:: sample_data(100)
 type (real_list_t), pointere:: next => null ()
end type

type (real_list_t), targeta:: my_real_list
type (real_list_t), pointero:: real_list_temp

real_list_temp => my_real_list
do
 read (1,iostat=ioerr) real_list_temp%sample_data
 if (ioerr /= 0) exit
 allocate (real_list_temp%next)
 real_list_temp => real_list_temp%next
end do

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

गो

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

जावा

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


मोडुला-2

पास्कल के रूप में पॉइंटर्स बहुत अधिक प्रयुक्त किए जाते हैं VAR प्रक्रिया कॉल में पैरामीटर है। मॉड्यूल-2 पास्कल की तुलना में और भी अधिक दृढ़ता से टाइप किया गया है, टाइप सिस्टम से बचने के कम तरीके हैं। मॉड्यूल -3 (जैसे मोडुला-3) के कुछ रूपों में गारवेज संग्रह सम्मिलित है।


ओबेरॉन

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


पास्कल

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

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

पर्ल

पर्ल प्रोग्रामिंग भाषा पॉइंटर्स का समर्थन करती है, हालांकि पैक और अनपैक फ़ंक्शंस के रूप में संभव्यता ही कभी उपयोग किया जाता है। ये केवल संकलित ऑपरेटिंग सिस्टम पुस्तकालयों के साथ साधारण परस्पर क्रिया के लिए अभिप्रेत हैं। अन्य सभी स्थितियो में, पर्ल संदर्भ (कंप्यूटर विज्ञान) का उपयोग करता है, जो टाइप किए जाते हैं और पॉइन्टर अंकगणित के किसी भी रूप की स्वीकृति नहीं देते हैं। उनका उपयोग जटिल डेटा संरचनाओं के निर्माण के लिए किया जाता है।[23]


यह भी देखें


संदर्भ

  1. Donald Knuth (1974). "Structured Programming with go to Statements" (PDF). Computing Surveys. 6 (5): 261–301. CiteSeerX 10.1.1.103.6084. doi:10.1145/356635.356640. S2CID 207630080. Archived from the original (PDF) on August 24, 2009.
  2. Reilly, Edwin D. (2003). Milestones in Computer Science and Information Technology. Greenwood Publishing Group. p. 204. ISBN 9781573565219. Retrieved 2018-04-13. Harold Lawson pointer.
  3. "IEEE Computer Society awards list". Awards.computer.org. Archived from the original on 2011-03-22. Retrieved 2018-04-13.
  4. ISO/IEC 9899, clause 6.7.5.1, paragraph 1.
  5. ISO/IEC 9899, clause 6.7.8, paragraph 10.
  6. ISO/IEC 9899, clause 7.17, paragraph 3: NULL... which expands to an implementation-defined null pointer constant...
  7. ISO/IEC 9899, clause 6.5.3.2, paragraph 4, footnote 87: If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined... Among the invalid values for dereferencing a pointer by the unary * operator are a null pointer...
  8. 8.0 8.1 Plauger, P J; Brodie, Jim (1992). ANSI and ISO Standard C Programmer's Reference. Redmond, WA: Microsoft Press. pp. 108, 51. ISBN 978-1-55615-359-4. An array type does not contain additional holes because all other types pack tightly when composed into arrays [at page 51]
  9. WG14 N1124, C – Approved standards: ISO/IEC 9899 – Programming languages – C, 2005-05-06.
  10. Jung, Ralf. "Pointers Are Complicated II, or: We need better language specs".
  11. Jung, Ralf. "Pointers Are Complicated, or: What's in a Byte?".
  12. us patent 6625718, Steiner, Robert C. (Broomfield, CO), "Pointers that are relative to their own present locations", issued 2003-09-23, assigned to Avaya Technology Corp. (Basking Ridge, NJ) 
  13. us patent 6115721, Nagy, Michael (Tampa, FL), "System and method for database save and restore using self-pointers", issued 2000-09-05, assigned to IBM (Armonk, NY) 
  14. "Based Pointers". Msdn.microsoft.com. Retrieved 2018-04-13.
  15. "Pointers to Member Functions". isocpp.org. Retrieved 2022-11-26.
  16. "c++filt(1) - Linux man page".
  17. "Itanium C++ ABI".
  18. Ulf Bilting, Jan Skansholm, "Vägen till C" (the Road to C), third edition, page 169, ISBN 91-44-01468-6
  19. Nick Parlante, [1], Stanford Computer Science Education Library, pp. 9–10 (2000).
  20. ISO 7185 Pascal Standard (unofficial copy), section 6.4.4 Pointer-types Archived 2017-04-24 at the Wayback Machine and subsequent.
  21. J. Welsh, W. J. Sneeringer, and C. A. R. Hoare, "Ambiguities and Insecurities in Pascal," Software: Practice and Experience 7, pp. 685–696 (1977)
  22. Free Pascal Language Reference guide, section 3.4 Pointers
  23. Contact details. "// Making References (Perl References and nested data structures)". Perldoc.perl.org. Retrieved 2018-04-13.


बाहरी संबंध