Pointers in C
Pointer क्या है? (सरल विचार)
अपने computer की memory को घरों की एक लंबी गली समझिए, और हर घर का एक address होता है। जब आप int x = 10; जैसा variable बनाते हैं, तो value 10 इन्हीं में से किसी एक घर में रखी जाती है। उस घर का भी एक address होता है।
Pointer बस एक ऐसा variable है जो सामान्य value के बजाय एक address रखता है। तो जहाँ x में number 10 है, वहीं x का pointer रखता है "वह address जहाँ 10 रहता है।" यही एक विचार pointers की पूरी नींव है।
सामान्य variable value रखता है। Pointer किसी value का address रखता है।
Pointer declare और इस्तेमाल
Pointer declare करने के लिए उसके नाम से पहले * लगाते हैं, और बताते हैं कि वह किस type की value की ओर इशारा करेगा।
#include <stdio.h>
int main() {
int x = 10;
int *p = &x; // p, x का address रखता है
printf("x ki value : %d\n", x);
printf("x ka address : %p\n", &x);
printf("p me address : %p\n", p);
printf("p se value : %d\n", *p); // dereference
return 0;
}x ki value : 10
x ka address : 0x7ffee3b2c8
p me address : 0x7ffee3b2c8
p se value : 10
ध्यान दें कि &x और p एक ही address print करते हैं — क्योंकि p में सचमुच x का address है। और *p वापस 10 देता है, उस address की value। (हर बार चलाने पर आपके address के numbers अलग होंगे — यह सामान्य है।)
दो मुख्य operators: & और *
Pointers की हर चीज़ इन्हीं दो operators पर आधारित है, जो एक-दूसरे के उल्टे हैं:
| Operator | नाम | मतलब |
|---|---|---|
& | Address-of | &x = वह address जहाँ x रखा है |
* | Dereference | *p = p में रखे address की value |
& पूछता है "यह कहाँ है?" और * पूछता है "वहाँ क्या है?"
Pointer से value बदलना
क्योंकि pointer के पास variable का address होता है, वह उस variable की value को सीधे बदल भी सकता है। यह pointers की सबसे शक्तिशाली क्षमताओं में से एक है।
#include <stdio.h>
int main() {
int x = 10;
int *p = &x;
*p = 25; // pointer से x बदलें
printf("x ab %d hai\n", x);
return 0;
}x ab 25 hai
हमने कभी सीधे x = 25 नहीं लिखा, फिर भी x 25 हो गया — क्योंकि *p x की memory तक पहुँचकर उसे बदल देता है। Functions इसी तरह उन्हें दिए गए variables को बदलते हैं (देखें call by value बनाम reference)।
NULL pointer और सुरक्षा
जो pointer अभी किसी valid चीज़ की ओर इशारा नहीं करता, उसे NULL पर set करना चाहिए। इससे एक सुरक्षित, जाँचने योग्य "खाली" स्थिति मिलती है।
#include <stdio.h>
int main() {
int *p = NULL; // अभी कुछ नहीं
if (p != NULL)
printf("Value: %d\n", *p);
else
printf("Pointer khaali hai, use karna safe nahi.\n");
return 0;
}Pointer khaali hai, use karna safe nahi.
NULL या बिना valid address वाले pointer पर कभी *p न लगाएँ — इससे program crash हो जाता है ("segmentation fault")। हमेशा पहले जाँचें।
Pointers की ज़रूरत क्यों?
Pointers शुरू में अमूर्त लगते हैं, पर C असली काम के लिए इन पर निर्भर है:
- Functions के अंदर variables बदलना — function आपके असली variable को update कर सकता है, सिर्फ़ copy को नहीं।
- Arrays और strings — ये अंदर से addresses के ज़रिए संभाले जाते हैं।
- Dynamic memory —
mallocसे runtime पर memory माँगने पर pointer मिलता है। - Efficiency — बड़ी data copy करने से address भेजना सस्ता है।
आम गलतियाँ
pके किसी valid address पर इशारा करने से पहले*pइस्तेमाल करना (uninitialised pointer)।&और*में उलझना — याद रखें:&address देता है,*value पढ़ता है।- बिना जाँचे NULL pointer dereference करना।
- यह भूलना कि pointer का type variable के type से मेल खाना चाहिए (
intके लिएint *)।
दो integer a और b declare करें, हर एक पर एक pointer point कराएँ, और सिर्फ़ pointers (*pa और *pb) से उनकी values swap करें। Result print करके पुष्टि करें कि swap हुआ।
सारांश
- Pointer किसी दूसरे variable का address रखता है, सामान्य value नहीं।
&xaddress देता है;*pउस address की value पढ़ता (या लिखता) है।*pसे आप असली variable को सीधे बदल सकते हैं।- बिना इस्तेमाल के pointers को
NULLरखें और dereference से पहले हमेशा जाँचें। - Pointers C में functions, arrays, strings और dynamic memory को शक्ति देते हैं।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C में pointer असल में क्या है?
C में & और * में क्या अंतर है?
& operator का मतलब है "address of" — &x बताता है कि x कहाँ रखा है। * operator का मतलब है "value at" (dereference) — *p उस address की value देता है जो pointer p में है। ये दोनों एक-दूसरे के उल्टे हैं।NULL pointer क्या है और यह क्यों उपयोगी है?
NULL पर set किया गया हो, यानी वह किसी सही चीज़ की ओर इशारा नहीं करता। यह एक साफ़ "खाली" स्थिति के रूप में उपयोगी है जिसे pointer इस्तेमाल करने से पहले जाँचा जा सकता है, जिससे किसी random address को पढ़ने से बचा जा सकता है।Pointers इतनी बार program क्यों crash करते हैं?
* इस्तेमाल करने से पहले हमेशा पक्का करें कि pointer कहीं valid जगह इशारा कर रहा है।