विज्ञापन

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

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

संकलन कोड

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

संकेत

आइए चीजों को फिर से शुरू करें। हर कंप्यूटर बाइनरी का उपयोग करता है बाइनरी क्या है? [प्रौद्योगिकी समझाया]यह देखते हुए कि बाइनरी कंप्यूटरों के अस्तित्व के लिए पूरी तरह से मौलिक है, यह अजीब लगता है कि हमने पहले कभी भी इस विषय से निपटा नहीं है - इसलिए आज मैंने सोचा कि मैं बाइनरी का संक्षिप्त विवरण देता हूं ... अधिक पढ़ें , लोगों की एक श्रृंखला और शून्य जो आधुनिक तकनीक को बनाते हैं जैसा कि हम जानते हैं। बाइनरी में कुछ भी कोड करना बेहद मुश्किल है (फाइलें बहुत भ्रामक होंगी), क्योंकि ये आपके द्वारा आवश्यक कच्चे निर्देश हैं सेंट्रल प्रोसेसिंग यूनिट या कार्य करने के लिए सी.पी.यू. एक सीपीयू क्या है और यह क्या करता है?कम्प्यूटिंग योग्‍य भ्रमित कर रहे हैं। वैसे भी CPU क्या है? और क्या मुझे क्वाड या दोहरे कोर प्रोसेसर की आवश्यकता है? एएमडी, या इंटेल के बारे में कैसे? हम अंतर समझाने में मदद करने के लिए यहाँ हैं! अधिक पढ़ें . इस रूप में जाना जाता है मशीन कोड.

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

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

संकेत

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

  • बेसिक
  • सी ++
  • तुतलाना

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

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

स्मृति प्रबंधन

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

इस खंड के लिए, यदि आपको इसकी समझ है तो यह मदद करेगा राम कैसे काम करता है राम को एक त्वरित और गंदा गाइड: आपको क्या जानना चाहिएरैम हर कंप्यूटर का एक महत्वपूर्ण घटक है, लेकिन यह भ्रामक हो सकता है। हम इसे आसानी से समझ में आने वाली शर्तों को तोड़ देंगे। अधिक पढ़ें .

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

कहो कि आपके पास एक चर है:

int myNumber;

यह कोड एक चर घोषित करता है मेरा नंबर, और यह इसका एक प्रारूप प्रदान करता है पूर्णांक. एक बार संकलित करने के बाद, कंप्यूटर इस आदेश की व्याख्या करता है:

"कुछ खाली मेमोरी का पता लगाएं, और एक पूर्णांक को संचित करने के लिए पर्याप्त स्थान आरक्षित करें"

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

अब अपने वैरिएबल के लिए एक मान असाइन करें:

myNumber = 10;

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

अब, यह सब ठीक है और अच्छा है, लेकिन मेमोरी लोकेशन कैसे अनारक्षित हैं? यदि प्रोग्राम उन सभी मेमोरी को आरक्षित करते हैं जो उन्हें पसंद हैं, तो RAM तुरंत भर जाएगा - जो कि एक के लिए बना देगा बहुत धीमी प्रणाली।

संकेत

इस संभावित मुद्दे से बचने के लिए, कई भाषाएँ लागू होती हैं कचरा इकट्ठा करने वाला, चर को नष्ट करने के लिए उपयोग किया जाता है (और इसलिए आरक्षित मेमोरी स्थानों को छोड़ दें) जो चले गए हैं दायरे से बाहर.

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

समारोह गणित () {int firstNumber = 1; } int सेकंडनंबर = 2; प्रिंट (FirstNumber + secondNumber); // काम नहीं करेगा

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

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

दर्ज करें: संकेत।

संकेत

सतह पर, संकेत सरल लगते हैं। वे संदर्भ (इंगित) स्मृति में एक स्थान। यह स्टैक पर "नियमित" चर के लिए किसी भी भिन्न नहीं लग सकता है, लेकिन मुझ पर भरोसा है, वहाँ एक बड़ा अंतर है। पॉइंटर्स को स्टोर किया जाता है ढेर. यह स्टैक के विपरीत है - यह कम व्यवस्थित है, लेकिन बहुत तेज है।

आइए नज़र डालते हैं कि स्टैक पर चर कैसे असाइन किए जाते हैं:

int नंबर = 1; int numberTwo = numberOne;

यह सरल वाक्यविन्यास है; चर नंबर दो नंबर एक होता है। यह मान असाइनमेंट के दौरान भर में कॉपी किया जाता है नंबर एक चर।

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

int नंबर = 1; int numberTwo = & numberOne;

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

int numberTwo = * numberOne;

अनुमंडल संचालक तारांकन चिह्न (*) है।

यह समझने के लिए एक कठिन अवधारणा हो सकती है, इसलिए इसे फिर से जाने दें:

  • का पता ऑपरेटर (&) मेमोरी एड्रेस को स्टोर करता है।
  • अनुमंडल संचालक (*) मान को एक्सेस करता है।

पॉइंटर्स घोषित करते समय सिंटैक्स थोड़ा बदलता है:

int * myPointer;

का डेटाटाइप पूर्णांक यहाँ सूचक को डेटाटाइप को संदर्भित करता है अंक, और सूचक के प्रकार को ही नहीं।

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

संकेत

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

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

संकेत

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

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

संकेत

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

आजके लिए इतना ही। मुझे आशा है कि आपने एक जटिल विषय के बारे में कुछ उपयोगी सीखा है। बेशक, हमने यह जानने के लिए सब कुछ कवर नहीं किया है - यह एक बहुत ही जटिल विषय है। यदि आप अधिक सीखने में रुचि रखते हैं, तो मैं अत्यधिक अनुशंसा करता हूं 24 घंटों में सी ++.

यदि यह थोड़ा जटिल था, तो देख लें सबसे आसान प्रोग्रामिंग भाषाओं के लिए हमारे गाइड शुरुआती के लिए सीखने के लिए 6 सबसे आसान प्रोग्रामिंग भाषाएँकार्यक्रम के लिए सीखना सही भाषा खोजने के बारे में है जितना कि यह संपादन प्रक्रिया के बारे में है। यहां शुरुआती लोगों के लिए शीर्ष छह सबसे आसान प्रोग्रामिंग भाषाएं हैं। अधिक पढ़ें .

क्या आपने सीखा कि आज पॉइंटर्स कैसे काम करते हैं? क्या आपको कोई ऐसे टिप्स और ट्रिक्स मिले हैं जिन्हें आप अन्य प्रोग्रामर के साथ साझा करना चाहते हैं? टिप्पणियों में कूदें और नीचे अपने विचार साझा करें!

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