🔴 Advanced  ·  Lesson 34

Pointer to Pointer

Pointer to pointer क्या है?

आप जानते हैं कि pointer किसी variable का address रखता है। Pointer to pointer (या double pointer) बस इसे एक कदम और आगे ले जाता है: यह किसी दूसरे pointer का address रखता है।

तो तीन चीज़ें हैं: value, उस value का pointer, और उस pointer का pointer। यह अमूर्त लगता है, पर एक झटपट तस्वीर इसे समझा देती है।

तीन स्तरों की तस्वीर

Memory picture
  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 और इस्तेमाल

C Language
#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;
}
Output:
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) भेजना इसे ठीक करता है।

C Language
#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;
}
Output:
p points to 99

Double pointer के बिना p main में NULL ही रहता। (तुलना करें call by value बनाम reference।)

Double pointers कहाँ इस्तेमाल होते हैं

  • Caller के लिए memory allocate करने और उनका pointer update करने वाले functions।
  • Strings के arraysmain में 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 क्या है?
Pointer to pointer, जिसे double pointer भी कहते हैं, एक ऐसा pointer है जो किसी दूसरे pointer का address रखता है — किसी सामान्य variable का नहीं। इसे दो asterisks से declare करते हैं, जैसे int **pp, और यह आपको pointer के साथ अप्रत्यक्ष रूप से, एक स्तर और बाहर से काम करने देता है।
Double pointer क्यों इस्तेमाल करेंगे?
सबसे आम कारण यह है कि किसी function को caller का pointer बदलने देना — जैसे memory allocate करके caller के pointer को उस पर point कराना। Double pointers strings के arrays और dynamically बने 2D arrays के लिए भी इस्तेमाल होते हैं।
C में ** का क्या मतलब है?
एकल * का मतलब है "pointer to", तो int * एक int का pointer है। दो, int **, का मतलब है "एक int के pointer का pointer"। Dereference करते समय एक * भीतरी pointer तक पहुँचता है और दूसरा * अंतिम value तक।
Double pointer से value कैसे निकालते हैं?
इसे दो बार dereference करते हैं। अगर pp double pointer है, तो *pp वह pointer देता है जिस पर वह इशारा करता है, और **pp श्रृंखला के अंत की असल value देता है। हर * एक स्तर हटाता है।
Function को मेरा pointer बदलने के लिए double pointer क्यों चाहिए?
क्योंकि C arguments value से pass करता है, function को आपके pointer की एक copy मिलती है, इसलिए उस copy को बदलने से आपका original प्रभावित नहीं होता। आपके pointer का address (double pointer) भेजने से function original pointer तक पहुँचकर उसे बदल सकता है।
← Back to C Tutorial
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.