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

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

मेमोरी और एड्रेस को समझने से लेकर पॉइंटर अंकगणित में महारत हासिल करने तक, सी पॉइंटर्स के विवरण का अन्वेषण करें।

स्मृति और पते

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

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

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

int x = 5;
int y = 10;

स्मृति में, यह इस तरह दिख सकता है:

पता

डेटा

1000

5

1004

10

यहां, अलग-अलग मेमोरी स्थान इन वेरिएबल्स को संग्रहीत करते हैं। वह डेटा एक्स जबकि, मेमोरी एड्रेस 1000 पर रहता है का डेटा मेमोरी एड्रेस 1004 पर है।

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

सी में पॉइंटर्स घोषित करना और आरंभ करना

इससे पहले कि आप C में पॉइंटर्स का उपयोग करके डेटा को संशोधित कर सकें, आपको इसे घोषित करने और आरंभ करने की आवश्यकता है।

घोषणा

एक पॉइंटर घोषित करने के लिए, आप उस डेटा प्रकार को निर्दिष्ट करते हैं जिस पर वह इंगित करता है, उसके बाद एक तारांकन चिह्न (*), और फिर पॉइंटर का नाम। उदाहरण के लिए:

int *ptr;

यहाँ, पूर्णांक *पीटीआर नामक सूचक घोषित करता है पीटीआर जो किसी पूर्णांक के मेमोरी एड्रेस को स्टोर कर सकता है।

प्रारंभ

घोषणा के बाद, आपको इसे उस मेमोरी पते से आरंभ करना चाहिए जिस पर यह इंगित करेगा। आप इसे इस प्रकार प्रारंभ कर सकते हैं:

int x = 5;
int *ptr = &x;

इस घोषणा में, & ऑपरेटर x वेरिएबल का पता प्राप्त करता है। कोड अनिवार्य रूप से कहता है "ptr एक वैरिएबल है, यह एक पूर्णांक मान के मेमोरी स्थान को संग्रहीत करता है, और वह स्थान वह है जहां x वर्तमान में संदर्भित है।"

अब, पीटीआर पूर्णांक चर का पता रखता है एक्स. उदाहरण के लिए:

चर

पता

कीमत

एक्स

1000

5

पीटीआर

1000

C में पॉइंटर्स न केवल एक वेरिएबल का पता संग्रहीत करते हैं बल्कि कंप्यूटर की मेमोरी के भीतर उनका अपना विशिष्ट पता भी होता है।

डीरेफ़रेंसिंग पॉइंटर्स

सी पॉइंटर को डीरेफ़रेंस करने का अर्थ है पॉइंटर द्वारा इंगित मेमोरी पते पर संग्रहीत मान तक पहुँचना।

मान लीजिए आपके पास एक सूचक है, पूर्णांक *पीटीआर, जो एक पूर्णांक चर को इंगित करता है, और उस चर का मान 10 है। पॉइंटर के माध्यम से मान तक पहुंचने के लिए, आप तारांकन चिह्न का उपयोग करते हैं (*) ऑपरेटर:

int x = 10;

int *ptr = &x; // ptr points to the address of x

int value = *ptr; // Dereferencing ptr to get the value

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

सूचक अंकगणित

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

यहां एक उदाहरण दिया गया है कि आप इसका उपयोग कैसे कर सकते हैं।

पूर्णांकों की एक सरणी घोषित करके प्रारंभ करें:

int numbers[] = {10, 20, 30};

एक पॉइंटर को एक इंट में घोषित करें और उसे संख्या सरणी का मेमोरी स्थान निर्दिष्ट करें:

int *ptr = numbers;

आपको यहां "&" ऑपरेटर का उपयोग करने की आवश्यकता नहीं है क्योंकि संख्याएं पहले से ही, अंतर्निहित रूप से, एक सूचक प्रकार है।

पीटीआर वैरिएबल अब सरणी में पहले तत्व को इंगित करता है:

printf("%d\n", *ptr); // 10

आप पॉइंटर को 2 से बढ़ाकर सरणी के तीसरे तत्व पर ले जा सकते हैं:

ptr += 2;
printf("%d\n", *ptr); // 30

आप इसमें से घटाकर सूचक को पीछे की ओर ले जा सकते हैं:

ptr--;
printf("%d\n", *ptr); ;// 20

सूचक अंकगणित सरणियों को नेविगेट करने और गतिशील मेमोरी आवंटन के साथ काम करने के लिए विशेष रूप से उपयोगी है।

सी में पॉइंटर्स और फ़ंक्शंस

अगर आप समझें कि C प्रोग्रामिंग में फ़ंक्शन कैसे काम करते हैं, तो आप फ़ंक्शन पॉइंटर्स का उपयोग करने की राह पर हैं। यहां कुछ तरीके दिए गए हैं जिनसे आप उनका उपयोग कर सकते हैं।

फ़ंक्शन सूचक

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

int (*operation)(int, int); // Declare a function pointer
operation = add; // Pointer to an add function
int result = operation(5, 3); // Call the function through the pointer

यह कोड नामक एक फ़ंक्शन पॉइंटर घोषित करता है संचालन यह एक ऐसे फ़ंक्शन को इंगित कर सकता है जो दो पूर्णांक लेता है और एक लौटाता है। यह (के लिए एक सूचक) निर्दिष्ट करता है जोड़ना के लिए कार्य करें संचालन. इसके बाद यह अप्रत्यक्ष रूप से कॉल करने के लिए ऑपरेशन वेरिएबल का उपयोग करता है जोड़ें (5,3).

संदर्भ से गुजरना

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

voidmodifyValue(int *x){
*x = 42; // Modifies the value of x in the calling code
}

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

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

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

int *createArray(intsize){
int *arr = (int *)malloc(size * sizeof(int));
return arr;
}

यह कोड एक फ़ंक्शन को परिभाषित करता है, createArray, वह एक पूर्णांक लेता है, आकार, इनपुट के रूप में। फ़ंक्शन के अंदर, यह गतिशील रूप से निर्दिष्ट आकार के पूर्णांक सरणी के लिए मेमोरी आवंटित करता है मॉलोक. ऐरे को आरंभ करने के बाद, यह इस नव निर्मित ऐरे में एक पॉइंटर लौटाता है।

सामान्य उपयोग

सी में पॉइंटर्स कई कारणों से आवश्यक हैं, और वे यही हैं सी को पायथन जैसी अन्य प्रोग्रामिंग भाषाओं से अलग करना. यहां कुछ सामान्य उपयोग दिए गए हैं:

  • गतिशील मेमोरी आवंटन
  • सरणी हेरफेर
  • संदर्भ से गुजरना
  • डेटा संरचनाएं
  • संसाधन प्रबंधन

पॉइंटर्स के इन सामान्य उपयोगों को समझना आपके सी प्रोग्रामिंग कौशल को बढ़ा सकता है। संकेतकों की अपनी समझ को बेहतर बनाने के लिए इनमें से कुछ का अभ्यास करें।

सी प्रोग्रामिंग में पॉइंटर्स का उपयोग करने का अभ्यास करें

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