Pointer to Pointer
Pointer to pointer क्या है?
आप जानते हैं कि pointer किसी variable का address रखता है। Pointer to pointer (या double pointer) बस इसे एक कदम और आगे ले जाता है: यह किसी दूसरे pointer का address रखता है।
तो तीन चीज़ें हैं: value, उस value का pointer, और उस pointer का pointer। यह अमूर्त लगता है, पर एक झटपट तस्वीर इसे समझा देती है।
तीन स्तरों की तस्वीर
pp ----> p ----> x (double) (pointer) (value = 10) pp me p ka address hai p me x ka address hai x me value 10 hai *pp = p (bhitri pointer) **pp = 10 (antim value)
हर तीर एक स्तर का "points to" है। pp से पूरी value तक पहुँचने के लिए आप दो तीर पार करते हैं — जो code में दो * मतलब है।
** declare और इस्तेमाल
#include <stdio.h>
int main() {
int x = 10;
int *p = &x; // p, x ko point karta hai
int **pp = &p; // pp, p ko point karta hai
printf("x = %d\n", x);
printf("*p = %d\n", *p); // 10
printf("**pp = %d\n", **pp); // 10
return 0;
}x = 10
*p = 10
**pp = 10
ध्यान दें **pp वही 10 तक पहुँचता है जो *p और x — बस एक और स्तर से होकर।
Function के अंदर pointer बदलना
यही double pointers का असली कारण है। चूँकि C value से pass करता है, single pointer लेने वाले function को एक copy मिलती है और वह caller का pointer नहीं बदल सकता। Pointer का address (double pointer) भेजना इसे ठीक करता है।
#include <stdio.h>
#include <stdlib.h>
void allocate(int **pp) {
*pp = malloc(sizeof(int)); // caller ka pointer badlein
**pp = 99; // value set karein
}
int main() {
int *p = NULL;
allocate(&p); // p ka address bhejein
printf("p points to %d\n", *p);
free(p);
return 0;
}p points to 99
Double pointer के बिना p main में NULL ही रहता। (तुलना करें call by value बनाम reference।)
Double pointers कहाँ इस्तेमाल होते हैं
- Caller के लिए memory allocate करने और उनका pointer update करने वाले functions।
- Strings के arrays —
mainमेंchar **argvठीक यही है। - Dynamic 2D arrays — pointers का array, हर एक एक row पर।
- Linked structures — list का head pointer update करना।
आम गलतियाँ
- गलत बार dereference करना —
*ppऔर**ppउलझाना। - जब function को pointer बदलना हो तो pointer के बजाय pointer का address न भेजना।
- यह भूलना कि
**ppतभी valid है जब दोनों स्तर कहीं असल जगह इशारा करें। - अतिरिक्त स्तरों में खो जाना — दो से ज़्यादा stars कम ही चाहिए और पढ़ने में कठिन।
int x = 5;, उसका pointer p, और p का double pointer pp बनाएँ। x, *p और **pp print करके पुष्टि करें कि तीनों 5 दिखाते हैं, फिर **pp से value बदलें और दोबारा print करें।
सारांश
- Pointer to pointer किसी दूसरे pointer का address रखता है।
- इसे
**से declare करें; value तक पहुँचने के लिए दो बार dereference करें। *ppभीतरी pointer देता है,**ppअंतिम value देता है।- Double pointers function को caller का अपना pointer बदलने देते हैं।
- String arrays, dynamic 2D arrays और linked structures के लिए इस्तेमाल।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C में pointer to pointer क्या है?
int **pp, और यह आपको pointer के साथ अप्रत्यक्ष रूप से, एक स्तर और बाहर से काम करने देता है।Double pointer क्यों इस्तेमाल करेंगे?
C में ** का क्या मतलब है?
* का मतलब है "pointer to", तो int * एक int का pointer है। दो, int **, का मतलब है "एक int के pointer का pointer"। Dereference करते समय एक * भीतरी pointer तक पहुँचता है और दूसरा * अंतिम value तक।Double pointer से value कैसे निकालते हैं?
pp double pointer है, तो *pp वह pointer देता है जिस पर वह इशारा करता है, और **pp श्रृंखला के अंत की असल value देता है। हर * एक स्तर हटाता है।