Pointers in C Language
C language(सी लैंग्वेज) के प्रयोग में सबसे अधिक रोचकता pointer(प्वाइंटर) में ही है।
इस रोचकता का कारण pointer(प्वाइंटर) में निहित पावर हैं। इसे भली-भांति समझ कर इसकी पावर का उपयोग बड़ी आसानी से किया जा सकता है। इसे प्रयोग करने के विभिन्न कारण है इनमें से प्रमुख निम्न प्रकार है।
- इसके माध्यम से किसी hidden variable(वेरीबल) को भी प्रयोग किया जा सकता है।
- इसे प्रयोग करते हुए मेमोरी का प्रयोग कम किया जा सकता है।
- यह प्रोग्राम(program) के रन होने की गति बढ़ाने में सहायक होते हैं।
- इसके माध्यम से प्रोग्राम की जटिलता को कम किया जा सकता है।
- इसके माध्यम से किसी function(फंक्शन) से एक से अधिक वैल्यू return(रिटर्न) करवाई जा सकती हैं।
- यह Multidimensional Array(मल्टीडाइमेंशनल एरे) को प्रयोग करने का बेहतर तरीका प्रदान करता हैं।
Pointer(प्वाइंटर) आशय ऐसे विशेष variable(वेरिएबल) से हैं जिसमें सामान्य वैल्यू की जगह पर मेमोरी की किसी लोकेशन का एड्रेस दूर होता हैं।
यह लोकेशन किसी अन्य variable(वेरीबल) का address(एड्रेस) भी हो सकता हैं। अन्य शब्दों में pointers(पॉइंट्स) का प्रयोग किसी अन्य वेरीएबल memory location(मेमोरी लोकेशन) पर स्टोर वैल्यू की ओर इंगित(point) करने के लिए काम में लिया जाता हैं।
चूंकि प्वाइंटर में किसी अन्य वेरीबल का एड्रेस स्टोर होता हैं अतः प्वाइंटर की सहायता से हम वेरिएबल के नाम को प्रयोग किए बिना ही उस वेरिएबल की वैल्यू का प्रयोग या उसमें परिवर्तन भी कर सकते हैंं।
प्वाइंटर्स को जानने के लिए सर्वप्रथम मेमोरी के बारे में जानना आवश्यक हैं। मेमोरी विभिन्न स्टोरीज सेल से मिलकर बनी होती हैं। इन विभिन्न सेल में ही डाटा स्टोर होता हैं। प्रत्येक सेल का अपना अलग एड्रेस होता हैं। यह एड्रेस सुनने से प्रारंभ होते हैं।
जब भी कोई वैल्यू मेमोरी में स्टोर की जाती है तो वह इन्हीं सेल में से किसी सेल में स्टोर हो जाती हैं। वैल्यू किस सन में स्टार्ट होगी यह निर्धारण operating system(ऑपरेटिंग सिस्टम) द्वारा प्रोग्राम के रन होते समय किया जाता हैं।
ऐसा हो सकता है कि किसी प्रोग्राम को रन करने पर कोई डाटा जिस एड्रेस पर स्टोर हो, वह अगली बार रन कराने पर किसी अन्य एड्रेस पर स्टोर हो। ऐसे में यदि किसी वेरिएबल का मेमोरी एड्रेस ज्ञात करना हो तो उसके लिए & ऑपरेटर(जिसे address of ऑपरेटर भी कहा जाता हैं।) का प्रयोग किया जाता हैं। किसी वेरिएबल के नाम के पहले & ऑपरेटर लगाने से उस वेरिएबल का मेमोरी ऐड्रेस ज्ञात हो जाता हैं।
int a = 10;
printf("%u",&a);
ऊपर दिए गए उदाहरण में वेरिएबल a में 10 स्टोर हैं, किन्तु प्रिन्ट करते वक्त यह वेरिएबल a का मैमोरी एड्रेस प्रिन्ट करेगा। ध्यान दें कि कंट्रोल कैरेक्टर %u डक प्रयोग unsigned int को प्रिन्ट करने के लिए किया जाता हैं तथा मैमोरी एड्रैस हमेशा unsigned int ही होता हैं। जब उपरोक्त उदाहरण में int a = 10 रन होगा तो वेरिएबल a को किसी मैमोरी लोकेशन printf() के माध्ययम से प्रिन्ट हो जाएगा।
उपरोक्त चित्र में यह दर्शाया गया हैं कि वेरिएबल a मैमोरी में लोकेशन 65508 पर स्टोर हुआ हैं। चूंकि a का data type इंटीजर हैं, अतः यह मैमोरी में दो बाइट की जगह लेता हैं। इस प्रकार वेरिएबल a ने मैमोरी लोकेशन 65508 व 65509 घेर रखी हैं। यदि इस स्थिति में &a का परिणाम देखा जाए तो यह वह 65508 होगा।
Variable(वेरिएबल) a की वैल्यू को या तो वेरिएबल a के माध्यम से अथवा उसके memory address(मेमोरी एड्रेस) के माध्यम से प्रयोग किया जा सकता हैं।
इस उदाहरण में वेरिएबल a का memory address(मेमोरी ऐड्रेस) pointer(पॉइन्टर) pa में स्टोर करवा दिया गया हैं। तत्पश्चात memory address के माध्यम से उसी वैल्यू को print(प्रिंट) करवाया गया हैं।
Example:-
इस उदाहरण में pointer(पॉइन्टर) का प्रयोग दर्शाया गया है:-
Output:-
Value of a is 10
Address of a is 6422220
Value of a is 10
Explain Example:-
उपरोक्त उदाहरण में &a के माध्यम से वेरिएबल a का memory address(मेमोरी एड्रेस) print(प्रिंट) करवाया गया है तथा *(&a) के माध्यम से उस memory address(मेमोरी एड्रेस) पर स्टोर वैल्यू को प्रिंट करवाया गया हैं।
उपरोक्त उदाहरण से हम यह तो जान ही गए हैं कि मेमोरी के एड्रेस साधारण अंक ही होते हैं तथा हम इन्हें या इन पर उपस्थित वैल्यू को आसानी से प्रयोग भी कर सकते हैं।
Pointer Declaration
अन्य variables(वेरिएबलो) की भांति pointer variable(पॉइन्टर वेरिएबल) को भी प्रयोग में लेने से पहले declare(डिक्लेयर) करना होता हैं। इसे declare(डिक्लेयर) करने का प्रारूप निम्न प्रकार हैं।
data_type *pointer_name
उपरोक्त प्रारूप compiler(कंपाइलर) को यह बताता है कि:-
- अन्य वेरिएबल की भांति ही pointer_name को भी मेमोरी में स्पेस चाहिए।
- pointer_name जिस value को पॉइंट करेगा उसका डाटा टाइप data_type प्रकार का होगा।
- pointer_name के पहले लगा * compiler(कंपाइलर) को यह बताता है कि यह एक pointer(पॉइन्टर) हैं।
Example:-
int *i_ptr
उपरोक्त उदाहरण compiler(कंपाइलर) को यह बता रहा है कि:-
- i_ptr को मेमोरी में space(स्पेस) चाहिए।
- i_ptr जिस वैल्यू को point करें डाटा टाइप int होगा।
Pointer variable(पॉइन्टर वेरिएबल) तथा सामान्य वेरिएबल को एक साथ भी declare(डिक्लेयर) किया जा सकता हैं।
++ int *i_ptr, total;
उपरोक्त उदाहरण compiler(कंपाइलर) को यह बता रहा है कि:-
- i_ptr को मेमोरी में space(स्पेस) चाहिए।
- i_ptr जिस वैल्यू को point(पॉइंट) करेगा उसका data type(डाटा टाइप) int होगा।
- i_ptr से पहले लगा * इसे pointer(पॉइन्टर) के रूप में declare(डिक्लेयर) कर रहा हैं।
- total को मेमोरी में space चाहिए।
- total में int टाइप की वैल्यू स्टोर होगी।
इसी प्रकार अन्य प्रकार के pointer variable(पॉइन्टर वेरिएबल ) declare(डिक्लेयर) किया जा सकता हैं।
float *f_ptr
char *c_ptr
ध्यान रहे कि उपरोक्त उदाहरण में int, float तथा char का अर्थ यह नहीं है कि pointer(पॉइन्टर) उस टाइप की वैल्यू को स्टोर करेंगे, बल्कि इसका अर्थ यह है कि इसमें int, float तथा char टाइप के variables(वेरीबलों) के एड्रेस को स्टोर किया जाएगा। ध्यान रखें कि पॉइन्टर हमेशा unsigned int ही होता है, जो कि सामान्यतः 2 बाइट स्पेस ही लेता हैं।
(पॉइन्टर में एड्रेस स्टोर करना)
किसी भी वेरिएबल में प्रथम बार वैल्यू स्टोर करना उसे Initialization(इनिशियलाइज) करना कहलाता हैं।
प्वाइंटर को Initialization(इनिशियलाइज) करने के लिए उसमें मेमोरी एड्रेस स्टोर करना होता हैं। पॉइन्टर वेरिएबल में किसी अन्य वेरिएबल के एड्रेस को निम्न प्रकार स्टोर किया जाता हैं:-
pointer_name = &variable_name
जैसे:-
int a = 112, *p;
p = &a;
उपरोक्त उदाहरण में वेरिएबल a में 112 स्टोर किया गया हैं, जो कि मेमोरी लोकेशन 65518 पर स्टोर हुआ हैं। p = &a ने यह एड्रेस प्वाइंटर वेरिएबल p में स्टोर कर दिया हैं।
Pointer(पॉइन्टर) को declare(डिक्लेयर) तथा Initialize(इनिशियलाइज) एक साथ भी किया जा सकता है।
int a = 112, *p = &a;
किन्तु यह ध्यान रखें कि निम्न statement(स्टेटमेंट) गलत हैं:-
int *p = *a, a = 112
इसके गलत होने का कारण यह हैं कि पहले *p = &a स्टेटमेंट रन होगा, उस समय वेरिएबल a का कोई अस्तित्व नहीं होगा। वही वेरिएबल a को क्रम में पहले डिक्लेयर करने से *p = &a स्टेटमेंट रन होते वक्त वेरिएबल a मेमोरी में स्थान ले चुका होगा।
Using painters
पॉइन्टर का प्रयोग करना
Pointer(पॉइन्टर) को Initialize(इनीशियलाइज) करने के बाद उस के माध्यम से वेरिएबल की वैल्यू को प्रयोग किया जा सकता हैं। किसी पॉइन्टर द्वारा वेरिएबल की वैल्यू को प्रयोग करने के लिए पॉइन्टर वेरिएबल के नाम से पूर्व * operator(ऑपरेटर) लगा दिया जाता हैं। इस * operator(ऑपरेटर )को समझने की दृष्टि से value at भी कहा जा सकता हैं।
int a = 112, b, *p;
p = &a;
b = *p;
उपरोक्त उदाहरण में वेरिएबल b में *p के मान को स्टोर करवाया जा रहा हैं। यदि वेरिएबल a memory location(मेमोरी लोकेशन) मान लो की 65518 पर स्टोर हुआ है तो p में 65518 स्टोर हो जाएगा तथा *p का आशय होगा value at 65518, अर्थात यह कहा जा सकता है कि जो भी वैल्यू memory location(मेमोरी लोकेशन) 65518 पर स्टोर है वह वेरिएबल b में स्टोर हो जाएगी। अतः वेरिएबल b में 112 स्टोर हो जाएगा।
Example:-
उदाहरण में एक वेरिएबल में integer value(इंटीरियर वैल्यू) को स्टोर कराते हुए उसी वेरिएबल को पॉइन्टर के माध्यम से प्रिंट करवाया गया हैं।
Output:-
Address of a is 6422216
Value of a 10
Explain example:-
उपरोक्त उदाहरण में p = &a के माध्यम से वेरिएबल a का एड्रेस(मेमोरी लोकेशन) पॉइन्टर p में स्टोर करवाया गया है, तथा बाद में *p के माध्यम से वेरिएबल a की वैल्यू प्रिंट कराई गई हैं।
Note:- ध्यान रखें कि पॉइन्टर initialize(इनिशियलाइज) करते समय पॉइन्टर के नाम से पहले * नहीं लगाया जाता हैं। किंतु पॉइन्टर के initialize(इनिशियलाइज) के बाद पॉइन्टर के नाम से पहले * लगाने से उस वेरिएबल वैल्यू स्टोर करवाई जा सकती है, जिसको यह पॉइंट कर रहा है। यह निम्न उदाहरण से साफ हो जाएगा।
Example:-
इस उदाहरण में पॉइन्टर के नाम के पहले * लगाते हुए अन्य वेरिएबल में वैल्यू स्टोर करवाई गई हैं।
Output:-
Value of a is 154
Value of a is 43
Value of a is 86
Explain Example:-
उपरोक्त उदाहरण में *p = 43 का प्रयोग करते हुए वेरिएबल a में वैल्यू स्टोर करवाई गई हैं। यह स्टेटमेंट a =43 के सम्मान ही है। चूंकि *p का आशय हुआ value at(p), अतः 43 सीधे वेरिएबल a के मेमोरी एड्रेस पर स्टोर होगा। ऐसा ही कार्य *p = (*p)*2 के साथ भी हुआ है। चूंकि = ऑपरेटर की स्थिति में पहले = चिन्ह के दाई और स्थित इससे की गणना की जाती है, अतः (*p) का आश्य p में स्टोर एड्रेस पर स्टोर वैल्यू से हुआ जो कि 43 हैं, अतः 43 को 2 से गुणा करने पर प्राप्त परिणाम को वापस (*p) पर स्टोर करवा दिया गया हैं।
Example:-
Output:-
Address of b is 6422216
Value of b is 10.500000
Explain Example:-
ध्यान दें कि जिस वैल्यू का address(एड्रेस) pointer(पॉइन्टर) में स्टोर होना है उसका data type(डेटा टाइप) और pointer(पॉइन्टर) का data type(डाटा टाइप) एक समान होना आवश्यक हैं। इसलिए उपरोक्त उदाहरण में pointer का data type भी float ही रखा गया हैं।
0 Comments