डबल पॉइंटर की घोषणा
सामान्य पॉइंटर की तरह ही, बस एक अतिरिक्त * जोड़ें।
सिंटैक्स
डेटा_प्रकार **पॉइंटर_नाम;
// उदाहरण
int **ptr;
char **strPtr;
चरण-दर-चरण प्रारंभिकरण
int value = 100; // 1. सामान्य चर
int *p1 = &value; // 2. सिंगल पॉइंटर (value का पता)
int **p2 = &p1; // 3. डबल पॉइंटर (p1 का पता)
एक्सेस करना
| अभिव्यक्ति | अर्थ | मान (उदाहरण में) |
|---|---|---|
value | मूल चर | 100 |
*p1 | p1 जो इशारा करता है | 100 |
**p2 | p2 → p1 → value | 100 |
*p2 | p2 जो इशारा करता है (p1 का पता) | &value |
p2 | p2 का अपना पता | &p1 |
पूर्ण C प्रोग्राम
#include <stdio.h>
int main() {
int element = 24;
// सिंगल पॉइंटर
int *ptr2 = &element;
// डबल पॉइंटर
int **ptr1 = &ptr2;
printf("element का मान = %d\n", element);
printf("सिंगल पॉइंटर से: %d\n", *ptr2);
printf("डबल पॉइंटर से: %d\n", **ptr1);
// पते प्रिंट करना
printf("\nपते:\n");
printf("element का पता: %p\n", (void*)&element);
printf("ptr2 में संग्रहीत: %p\n", (void*)ptr2);
printf("ptr1 में संग्रहीत: %p\n", (void*)ptr1);
printf("ptr2 का पता: %p\n", (void*)&ptr2);
return 0;
}
आउटपुट
element का मान = 24 सिंगल पॉइंटर से: 24 डबल पॉइंटर से: 24 पते: element का पता: 0x7ffee3b8c9ac ptr2 में संग्रहीत: 0x7ffee3b8c9ac ptr1 में संग्रहीत: 0x7ffee3b8c9a0 ptr2 का पता: 0x7ffee3b8c9a0
आम गलतियाँ
❌ गलत
int **p = &a; // गलत: &a है int*, लेकिन p है int**
✅ सही
int *p1 = &a;
int **p2 = &p1;
उपयोग के मामले
- फंक्शन में पॉइंटर संशोधित करना:
void alloc(int **p, int n) { *p = malloc(n * sizeof(int)); } - 2D डायनामिक सरणी:
int **arr = malloc(rows * sizeof(int*)); - स्ट्रिंग्स की सरणी:
char **argv(कमांड लाइन आर्गुमेंट्स) - लिंक्ड लिस्ट हेड संशोधन:
void insert(Node **head, int data)