👉
Pointers

Pointers — Basics

Addresses in Memory
💡 Pointer ek ghar ka pata (address) hai, na ki ghar khud — jaise tumhare dost ka address likha hai ek kagaz par, us kagaz (pointer) se tum unke ghar (variable) tak pahunch sakte ho, bina khud wo ghar bane.

Har variable computer ki memory mein ek jagah (address) par store hota hai. Pointer ek special variable hai jo kisi doosre variable ka address store karta hai — na ki uski value.

& operator (address-of) kisi variable ka address nikalta hai. * operator (dereference) pointer ke through us address par jo value hai, wahan tak pahunchta hai — do bilkul alag context mein * ka matlab alag hota hai (declare karte waqt "ye pointer hai" bolta hai, use karte waqt "is address ki value do" bolta hai).

Pointers C ko itna powerful banate hain — memory ko directly manipulate karna, functions ko badi cheezein efficiently pass karna, dynamic memory allocate karna — ye sab pointers ke bina possible nahi.

int x = 10;
int *p = &x;   // p ab x ka address store karta hai

printf("%d\n", x);    // 10
printf("%p\n", &x);   // x ka address (jaise 0x7ffd...)
printf("%p\n", p);    // same address
printf("%d\n", *p);   // 10 (dereference — us address ki value)
👉
Pointer ek ghar ka pata (address) hai, na ki ghar khud — jaise tumhare dost ka address likha hai ek kagaz par, us kagaz (pointer) se tum unke ghar (variable) tak pahunch sakte ho, bina khud wo ghar bane.
1 / 6
⚡ झट से Recap
  • Pointer = kisi variable ka address store karta hai
  • & = address nikalo, * = us address ki value do (dereference)
  • Pointers C ko powerful banate hain — memory control
इस page में (2 subtopics)

NULL pointer ek pointer hai jo jaan-boojh kar kahi bhi point nahi karta — usually pointer ko initialize karte waqt use hota hai jab tak use ka pata na ho: int *p = NULL;. Kisi bhi pointer ko dereference karne se pehle check karna best practice hai ki wo NULL to nahi.

Wild pointer NULL se bhi zyada dangerous hai — ye ek pointer hai jo initialize hi nahi hua (koi bhi random garbage address ho sakta hai). NULL pointer ko dereference karne se turant crash (segmentation fault) milta hai, jo debug karna aasan hai. Wild pointer galti se kisi doosre program ki memory ko corrupt kar sakta hai bina turant crash hue — bahut zyada dangerous.

int *p = NULL;   // safe: jaan-boojh kar "kahi nahi"

if (p != NULL) {
  printf("%d\n", *p);  // sirf tab dereference karo jab NULL na ho
} else {
  printf("p abhi kisi cheez ko point nahi kar raha\n");
}

int *wild;         // DANGEROUS: uninitialized, random address
// printf("%d", *wild); // undefined behavior — kabhi bhi crash ya corruption
⚠️Common Mistake: Har pointer ko declare karte hi initialize karo — ya kisi valid address se, ya NULL se. Uninitialized ("wild") pointers C ke sabse dangerous aur debug-karne-mein-mushkil bugs ka source hain.

Ek bahut common interview question: sizeof(int*) kitna hai? Jawaab: pointer ka size uske TYPE par depend nahi karta jo wo point kar raha hai — ye sirf machine architecture par depend karta hai (typically 8 bytes 64-bit systems par, 4 bytes 32-bit par), chahe wo int* ho ya double* ya kisi bade struct ka pointer.

Ye isliye hai kyunki pointer sirf ek memory address store karta hai — address ka size fixed hai (jitni bits memory addressing ke liye use hoti hain), chahe us address par kitna bhi bada data ho.

int i = 10;
double d = 3.14;
char c = 'A';

printf("%lu\n", sizeof(int*));    // typically 8 (64-bit system par)
printf("%lu\n", sizeof(double*)); // 8 — same!
printf("%lu\n", sizeof(char*));   // 8 — same!
printf("%lu\n", sizeof(int));     // 4 (data ka size, pointer ka nahi)
💡Tip: Interview mein ye common trap hai — log sochte hain double* ka size int* se bada hoga kyunki double bada hai. Galat! Sirf pointed-to value ka size type-dependent hai, pointer khud ka size hamesha same rehta hai.