सी/सी ++ में पॉइंटर्स को समझना
इससे पहले कि कोई समझ सके कि पॉइंटर्स कैसे काम करते हैं, यह समझना आवश्यक है कि प्रोग्राम में चर कैसे संग्रहीत किए जाते हैं और एक्सेस किए जाते हैं। प्रत्येक चर के पास 2 भाग होते हैं - (1) स्मृति पता जहां डेटा संग्रहीत किया जाता है और (2) संग्रहीत डेटा का मान।
मेमोरी एड्रेस को अक्सर एक चर के लाभा के रूप में जाना जाता है, और संग्रहीत डेटा के मूल्य को रावल्यू (एल और आर अर्थ बाएं और दाएं) के रूप में जाना जाता है।
बयान पर विचार करें:
int x = 10;
आंतरिक रूप से, प्रोग्राम चर एक्स के साथ एक स्मृति पता जोड़ता है। इस मामले में, मान लीजिए कि कार्यक्रम x को पते 1001 (यथार्थवादी पता नहीं, बल्कि सादगी के लिए चुना गया) पर रहने के लिए निर्दिष्ट करता है। इसलिए, x का lvalue (स्मृति पता) 1001 है, और x का रावल (डेटा मान) 10 है।
The rvalue is accessed by simply using the variable “x”. In order to access the lvalue, the “address of” operator (‘&’) is needed. The expression ‘&x’ is read as "the address of x".
Expression Value
----------------------------------
x 10
&x 1001
The value stored in x can be changed at any time (e.g. x = 20), but the address of x (&x) can never be changed.
एक सूचक केवल एक चर है जिसे किसी अन्य चर को संशोधित करने के लिए उपयोग किया जा सकता है। यह इसके रावल्यू के लिए स्मृति पता रखते हुए करता है। यही है, यह स्मृति में एक और स्थान को इंगित करता है।
"X" को पॉइंटर बनाना निम्नानुसार किया जाता है:
int* xptr = &x;
The “int*” tells the compiler that we are creating a pointer to an integer value. The “= &x” part tells the compiler that we are assigning the address of x to the rvalue of xptr. Thus, we are telling the compiler that xptr “points to” x.
यह मानते हुए कि xptr को 1002 के मेमोरी एड्रेस में असाइन किया गया है, तो प्रोग्राम की मेमोरी इस तरह दिखाई दे सकती है:
Variable lvalue rvalue
--------------------------------------------
x 1001 10
xptr 1002 1001
पहेली का अगला भाग "संकेतक ऑपरेटर" ('*') है, जिसका उपयोग निम्नानुसार किया जाता है:
int y = *xptr;
इंडिकेटर ऑपरेटर प्रोग्राम को डेटा मान के बजाए स्मृति पते के रूप में xptr के रैवल्यू की व्याख्या करने के लिए कहता है। यही है, कार्यक्रम xptr (1001) द्वारा दिए गए पते पर संग्रहीत डेटा मान (10) की तलाश करता है।
यह सब एक साथ डालें:
Expression Value
--------------------------------------------
x 10
&x 1001
xptr 1001
&xptr 1002
*xptr 10
अब अवधारणाओं को समझाया गया है, पॉइंटर्स की शक्ति का प्रदर्शन करने के लिए यहां कुछ कोड दिया गया है:
int x = 10;
int *xptr = &x;
printf("x = %d\n", x);
printf("&x = %d\n", &x);
printf("xptr = %d\n", xptr);
printf("*xptr = %d\n", *xptr);
*xptr = 20;
printf("x = %d\n", x);
printf("*xptr = %d\n", *xptr);
आउटपुट के लिए आप देखेंगे (नोट: स्मृति पता हर बार अलग होगा):
x = 10
&x = 3537176
xptr = 3537176
*xptr = 10
x = 20
*xptr = 20
Notice how assigning a value to ‘*xptr’ changed the value of ‘x’. This is because ‘*xptr’ and ‘x’ refer to the same location in memory, as evidenced by ‘&x’ and ‘xptr’ having the same value.