उदाहरणों के साथ C ++ पॉइंटर्स

विषय - सूची:

Anonim

पॉइंटर्स क्या हैं?

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

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

इस C ++ ट्यूटोरियल में, आप सीखेंगे:

  • पॉइंटर्स क्या हैं?
  • C ++ में पता चलता है
  • सूचक घोषणा
  • संदर्भ ऑपरेटर (&) और डिफरेंस ऑपरेटर (*)
  • संकेत और सारणी
  • नल पॉइंटर
  • चर के संकेत
  • पॉइंटर्स का अनुप्रयोग
  • पॉइंटर्स का उपयोग करने के लाभ

C ++ में पता चलता है

C ++ पॉइंटर्स को समझने के लिए, आपको यह समझना चाहिए कि कंप्यूटर डेटा को कैसे स्टोर करते हैं।

जब आप अपने C ++ प्रोग्राम में एक वैरिएबल बनाते हैं, तो इसे कुछ स्थान कंप्यूटर मेमोरी को सौंपा जाता है। इस चर का मान नियत स्थान पर संग्रहीत है।

कंप्यूटर मेमोरी में उस स्थान को जानने के लिए जहां डेटा संग्रहीत है, C ++ & (संदर्भ) ऑपरेटर प्रदान करता है । ऑपरेटर वह पता लौटाता है जो एक चर पर होता है।

उदाहरण के लिए, यदि x एक चर है, और x चर का पता देता है।

सूचक घोषणा

C ++ की घोषणा निम्नलिखित सिंटैक्स लेता है:

datatype *variable_name;
  • डेटाटाइप सूचक का आधार प्रकार है जो एक मान्य C ++ डेटा प्रकार होना चाहिए।
  • चर_नाम सूचक सूचक चर का नाम होना चाहिए।
  • पॉइंटर डिक्लेरेशन के लिए ऊपर उपयोग किया गया तारांकन चिह्न के समान है जिसका उपयोग गुणन क्रिया को करने के लिए किया जाता है। यह एक तारांकन चिह्न है जो चर को एक सूचक के रूप में चिह्नित करता है।

यहाँ C ++ में मान्य सूचक घोषणाओं का एक उदाहरण दिया गया है:

int *x; // a pointer to integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *ch // a pointer to a character

संदर्भ ऑपरेटर (&) और डिफरेंस ऑपरेटर (*)

संदर्भ ऑपरेटर (और) चर का पता देता है।

डेरेफेरेंस ऑपरेटर (*) हमें उस मूल्य को प्राप्त करने में मदद करता है जिसे मेमोरी एड्रेस में स्टोर किया गया है।

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

अगर हमारे पास एक वैरिएबल है जिसका नाम संख्या है, तो पता 0x234 में संग्रहीत किया जाता है और मूल्य 28 जमा करता है।

संदर्भ ऑपरेटर (&) 0x234 लौटाएगा।

अनुमापन ऑपरेटर (*) 5 वापस आ जाएगा।

उदाहरण 1:

#include using namespace std;int main() {int x = 27;int *ip;ip = &x;cout << "Value of x is : ";cout << x << endl;cout << "Value of ip is : ";cout << ip<< endl;cout << "Value of *ip is : ";cout << *ip << endl;return 0;}

आउटपुट:

यह कैसे काम करता है:

यहाँ कोड का एक स्क्रीनशॉट है:

कोड स्पष्टीकरण:

  1. Iostream हैडर फ़ाइल आयात करें। यह हमें हेडर फ़ाइल में परिभाषित कार्यों को त्रुटियों के बिना उपयोग करने की अनुमति देगा।
  2. अपनी कक्षाओं को बिना बुलाए उपयोग करने के लिए एसटीडी नेमस्पेस शामिल करें।
  3. मुख्य () फ़ंक्शन को कॉल करें। इस फ़ंक्शन के शरीर के भीतर प्रोग्राम लॉजिक जोड़ा जाना चाहिए। {फ़ंक्शन के शरीर की शुरुआत के निशान।
  4. पूर्णांक चर x घोषित करें और इसे 27 का मान निर्दिष्ट करें।
  5. पॉइंटर चर * आईपी घोषित करें।
  6. पॉइंटर वेरिएबल में वेरिएबल x के एड्रेस को स्टोर करें।
  7. कंसोल पर कुछ टेक्स्ट प्रिंट करें।
  8. स्क्रीन पर वेरिएबल x का मान प्रिंट करें।
  9. कंसोल पर कुछ टेक्स्ट प्रिंट करें।
  10. चर x का पता प्रिंट करें। पते का मूल्य चर आईपी में संग्रहीत किया गया था।
  11. कंसोल पर कुछ टेक्स्ट प्रिंट करें।
  12. सूचक के पते पर संग्रहीत का प्रिंट मूल्य।
  13. कार्यक्रम को सफल निष्पादन पर मूल्य वापस करना चाहिए।
  14. मुख्य () फ़ंक्शन के शरीर का अंत।

संकेत और सारणी

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

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

p = arr;

उपरोक्त सही है क्योंकि गिरफ्तारी सरणियों के पते का प्रतिनिधित्व करती है। यहाँ एक और उदाहरण है:

p = &arr;

ऊपर गलत है।

हम एक सरणी को एक सूचक में बदल सकते हैं। उदाहरण के लिए:

int arr [20];int * ip;

नीचे एक मान्य ऑपरेशन है:

ip = arr;

उपरोक्त घोषणा के बाद, आईपी और गिरफ्तारी समान होगी, और वे गुण साझा करेंगे। हालाँकि, एक अलग पते को आईपी को सौंपा जा सकता है, लेकिन हम गिरफ्तार करने के लिए कुछ भी निर्दिष्ट नहीं कर सकते हैं।

उदाहरण 2:

यह उदाहरण दिखाता है कि पॉइंटर्स का उपयोग करके किसी सरणी को कैसे पार किया जाए:

#include using namespace std;int main() {int *ip;int arr[] = { 10, 34, 13, 76, 5, 46 };ip = arr;for (int x = 0; x < 6; x++) {cout << *ip << endl;ip++;}return 0;}

आउटपुट:

यहाँ कोड का एक स्क्रीनशॉट है:

कोड स्पष्टीकरण:

  1. पूर्णांक सूचक चर IP की घोषणा करें।
  2. गिरफ्तारी नाम की एक सरणी घोषित करें और उसमें 6 पूर्णांक स्टोर करें।
  3. IP को गिरफ्तार असाइन करें। आईपी ​​और गिरफ्तारी समतुल्य हो जाएगी।
  4. लूप के लिए बनाएं। अनुक्रमणिका 0 से 5 तक के सरणी तत्वों पर पुनरावृति करने के लिए लूप वेरिएबल x बनाया गया था।
  5. पॉइंटर आईपी के पते पर संग्रहीत मूल्यों को प्रिंट करें। एक मूल्य प्रति पुनरावृत्ति पर वापस किया जाएगा, और कुल 6 पुनरावृत्ति की जाएगी। एंडल एक C ++ कीवर्ड है जिसका मतलब है एंड लाइन। यह क्रिया आपको प्रत्येक मान के मुद्रित होने के बाद कर्सर को अगली पंक्ति में ले जाने की अनुमति देती है। प्रत्येक मूल्य एक व्यक्तिगत पंक्ति में मुद्रित किया जाएगा।
  6. हर पुनरावृत्ति के बाद पॉइंटर को अगले इंट पोजीशन में ले जाने के लिए।
  7. एक लूप के लिए अंत।
  8. कार्यक्रम को सफल निष्पादन पर कुछ वापस करना होगा।
  9. मुख्य () फ़ंक्शन बॉडी का अंत।

नल पॉइंटर

यदि कोई सटीक पता नहीं है जिसे सौंपा जाना है, तो सूचक चर को NULL सौंपा जा सकता है। यह घोषणा के दौरान किया जाना चाहिए। इस तरह के पॉइंटर को अशक्त पॉइंटर के रूप में जाना जाता है। इसका मान शून्य है और iostream जैसी कई मानक पुस्तकालयों में परिभाषित किया गया है।

उदाहरण 3:

#include using namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}

आउटपुट:

यहाँ कोड का एक स्क्रीनशॉट है:

कोड स्पष्टीकरण:

  1. एक पॉइंटर वैरिएबल IP घोषित करें और इसे NULL का मान निर्दिष्ट करें।
  2. कंसोल पर कुछ पाठ के साथ पॉइंटर वैरिएबल आईपी का प्रिंट मूल्य।
  3. कार्यक्रम सफल होने पर मूल्य वापस करना चाहिए।
  4. मुख्य () फ़ंक्शन के शरीर का अंत।

चर के संकेत

सी ++ के साथ, आप कंप्यूटर की मेमोरी से सीधे डेटा में हेरफेर कर सकते हैं।

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

पॉइंटर वैरिएबल कंप्यूटर की मेमोरी में एक विशिष्ट पते की ओर इशारा करते हैं जो दूसरे वेरिएबल द्वारा इंगित किया गया है।

इसे निम्नानुसार घोषित किया जा सकता है:

int *p;

या,

int* p;

आप उदाहरण में, हमने पॉइंटर चर p घोषित किया है।

यह एक मेमोरी एड्रेस रखेगा।

तारांकन परिचालक ऑपरेटर है जिसका अर्थ है एक सूचक।

पॉइंटर पी मेमोरी एड्रेस में एक पूर्णांक मान की ओर इशारा कर रहा है।

उदाहरण 4:

#include using namespace std;int main() {int *p, x = 30;p = &x;cout << "Value of x is: " << *p;return 0;}

आउटपुट:

यहाँ कोड का एक स्क्रीनशॉट है:

कोड स्पष्टीकरण:

  1. 30 के मान के साथ एक सूचक चर p और एक चर x घोषित करें।
  2. चर x का पता असाइन करें p।
  3. कंसोल पर कुछ पाठ के साथ-साथ पॉइंटर चर p का मान प्रिंट करें।
  4. कार्यक्रम सफल होने पर मूल्य वापस करना चाहिए।
  5. मुख्य () फ़ंक्शन के शरीर का अंत।

पॉइंटर्स का अनुप्रयोग

C ++ में फ़ंक्शंस केवल एक मान लौटा सकते हैं। इसके अलावा, फ़ंक्शन में घोषित सभी चर फ़ंक्शन कॉल स्टैक पर आवंटित किए जाते हैं। जैसे ही फ़ंक्शन वापस आता है, सभी स्टैक चर नष्ट हो जाते हैं।

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

उदाहरण 5:

#include using namespace std;void test(int*, int*);int main() {int a = 5, b = 5;cout << "Before changing: << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;test(&a, &b);cout << "\nAfter changing" << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;}void test(int* n1, int* n2) {*n1 = 10;*n2 = 11;}

आउटपुट:

यहाँ कोड का एक स्क्रीनशॉट है:

कोड स्पष्टीकरण:

  1. फ़ंक्शन नाम का एक प्रोटोटाइप बनाएं जो दो पूर्णांक मापदंडों को ले जाएगा।
  2. मुख्य () फ़ंक्शन को कॉल करें। हम इसके बॉडी के अंदर प्रोग्राम लॉजिक को जोड़ेंगे।
  3. दो पूर्णांक वैरिएबल को ए और बी घोषित करें, प्रत्येक 5 के मान के साथ।
  4. कंसोल पर कुछ टेक्स्ट प्रिंट करें। एंडल (अंतिम पंक्ति) कर्सर को अगली पंक्ति में मुद्रण शुरू करने के लिए ले जाएगा।
  5. अन्य पाठ के साथ कंसोल पर चर के मूल्य को प्रिंट करें। एंडल (अंतिम पंक्ति) कर्सर को अगली पंक्ति में मुद्रण शुरू करने के लिए ले जाएगा।
  6. अन्य पाठ के साथ कंसोल पर वेरिएबल बी के मूल्य को प्रिंट करें। एंडल (अंतिम पंक्ति) कर्सर को अगली पंक्ति में मुद्रण शुरू करने के लिए ले जाएगा।
  7. परीक्षण नामक एक फ़ंक्शन बनाएं () जो मापदंडों के रूप में चर ए और बी के पते में लेता है।
  8. कंसोल पर कुछ टेक्स्ट प्रिंट करें। पाठ मुद्रित होने से पहले \ n एक नई रिक्त पंक्ति बनाएगा। एंडल (अंतिम पंक्ति) टेक्स्ट प्रिंट होने के बाद कर्सर को अगली पंक्ति में प्रिंट करना शुरू कर देगा।
  9. अन्य पाठ के साथ कंसोल पर चर के मूल्य को प्रिंट करें। एंडल (अंतिम पंक्ति) कर्सर को अगली पंक्ति में मुद्रण शुरू करने के लिए ले जाएगा।
  10. अन्य पाठ के साथ कंसोल पर वेरिएबल बी के मूल्य को प्रिंट करें। एंडल (अंतिम पंक्ति) कर्सर को अगली पंक्ति में मुद्रण शुरू करने के लिए ले जाएगा।
  11. कार्यक्रम सफल होने पर मूल्य वापस करना चाहिए।
  12. मुख्य () फ़ंक्शन के शरीर का अंत।
  13. फ़ंक्शन परीक्षण को परिभाषित करना ()। फ़ंक्शन को दो पूर्णांक सूचक चर * n1 और * n2 लेना चाहिए।
  14. सूचक चर को निर्दिष्ट करना * n1 10 का मान।
  15. सूचक चर को निर्दिष्ट करना * n2 11 का मान।
  16. फ़ंक्शन परीक्षण के शरीर का अंत ()।

हालांकि, फ़ंक्शन मान के अंदर a और b को चर करने के लिए नए मान असाइन किए गए हैं, एक बार फ़ंक्शन कॉल पूरा होने के बाद, वही बाहरी फ़ंक्शन मुख्य को प्रतिबिंबित नहीं करता है।

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

उपरोक्त मामले में, फ़ंक्शन 'परीक्षण' में चर 'a' और 'b' का पता है। ये दो चर 'फ़ंक्शन' परीक्षण से सीधे सुलभ हैं, और इसलिए इन चर के लिए किए गए किसी भी परिवर्तन को कॉल फ़ंक्शन "मुख्य" में परिलक्षित होता है।

पॉइंटर्स का उपयोग करने के लाभ

यहाँ, पॉइंटर्स का उपयोग करने के लाभ / लाभ हैं

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

सारांश:

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