Pointers to Pointers
int pp ek pointer hai jo kisi doosre pointer (int *) ka address store karta hai. *pp se tumhe wo pointer milta hai, pp se tumhe uske through asli value milti hai.
Ye tab useful hota hai jab function ko ek pointer ko khud modify karna ho (na ki jis cheez ko wo point kar raha hai) — jaise ek function jo dynamically memory allocate kare aur caller ke pointer ko update kare.
int x = 10;
int *p = &x;
int **pp = &p;
printf("%d\n", x); // 10
printf("%d\n", *p); // 10
printf("%d\n", **pp); // 10 — double dereference- int **pp = pointer to a pointer
- **pp se double dereference karke asli value milti hai
- Use hota hai jab function ko khud pointer modify karna ho
char grid ek bahut common pattern hai jab tumhe ek "array of arrays" chahiye jinki sizes runtime par decide honi hain — jaise ek array of strings (char* har ek string hai, aur ek array of these pointers, jise access karne ke liye char chahiye).
Ye static 2D arrays (int grid[3][4]) se alag hai — dynamic version mein har "row" apni alag memory allocation ho sakti hai, alag sizes ki bhi ho sakti hai (jaise ek "jagged array" jaisa concept).
char *names[3] = {"Aarav", "Riya", "Zoya"};
char **p = names; // pointer to pointer
printf("%s\n", p[0]); // Aarav
printf("%s\n", *(p+1)); // Riya
printf("%s\n", names[2]); // ZoyaJab tum ek C program terminal se run karte ho arguments ke saath ($ ./program hello world), main() unhe do parameters ke through receive kar sakta hai: int argc (kitne arguments hain, program ka naam bhi count hota hai) aur char **argv (actual arguments, strings ke array ke roop mein).
argv[0] hamesha program ka khud ka naam hota hai, argv[1] pehla actual argument hai, waghera. char **argv ka matlab hai "array of strings", jaha har string khud ek char* hai.
// $ ./greet Aarav 25
int main(int argc, char **argv) {
printf("%d\n", argc); // 3 (program name + 2 args)
printf("%s\n", argv[0]); // ./greet
printf("%s\n", argv[1]); // Aarav
printf("%s\n", argv[2]); // 25
return 0;
}