पॉइंटर टू पॉइंटर क्या है?
पॉइंटर टू पॉइंटर (Pointer to Pointer) या डबल पॉइंटर (Double Pointer) एक ऐसा चर होता है जो दूसरे पॉइंटर का पता संग्रहीत करता है। इसे ** से दर्शाया जाता है।
घोषणा और प्रारंभिकरण
// घोषणा
डेटा_प्रकार **पॉइंटर_नाम;
// उदाहरण
int **ptr;
// प्रारंभिकरण
int a = 10;
int *p = &a; // p, a का पता रखता है
int **q = &p; // q, p का पता रखता है (डबल पॉइंटर)
मेमोरी प्रतिनिधित्व
चर a (मान 10) → पता: 1000 पॉइंटर p → पता: 2000, मान: 1000 (a का पता) डबल पॉइंटर q → पता: 3000, मान: 2000 (p का पता)
एक्सेस करना
*p→ a का मान (10)**q→ a का मान (10)*q→ p का मान (1000, जो a का पता है)
उदाहरण प्रोग्राम 1: बुनियादी प्रदर्शन
#include <stdio.h>
int main() {
int a = 10;
int *p;
int **q;
p = &a;
q = &p;
printf("a = %d\n", a);
printf("a का मान पॉइंटर से: %d\n", *p);
printf("a का मान डबल पॉइंटर से: %d\n", **q);
return 0;
}
आउटपुट
a = 10 a का मान पॉइंटर से: 10 a का मान डबल पॉइंटर से: 10
उदाहरण प्रोग्राम 2: विस्तृत संबंध विश्लेषण
#include <stdio.h>
int main() {
int a = 10;
int *p = &a;
int **q = &p;
printf("a का मान: %d\n", a); // 10
printf("a का पता (p): %p\n", (void*)p); // a का पता
printf("*p (a का मान): %d\n", *p); // 10
printf("p का पता (q): %p\n", (void*)q); // p का पता
printf("*q (p का मान = a का पता): %p\n", (void*)*q); // a का पता
printf("**q (a का मान): %d\n", **q); // 10
return 0;
}
व्यावहारिक उपयोग
- फंक्शन में पॉइंटर को संशोधित करना: फंक्शन को पॉइंटर का पता पास करके मूल पॉइंटर बदलना।
- डायनामिक 2D सरणी: पॉइंटर्स की सरणी आवंटित करना।
- कमांड लाइन आर्गुमेंट्स:
char **argv। - लिंक्ड लिस्ट/ट्री में नोड संशोधन: हेड पॉइंटर अपडेट करना।
उदाहरण: फंक्शन में पॉइंटर बदलना
void allocate(int **ptr, int size) {
*ptr = malloc(size * sizeof(int)); // मूल पॉइंटर बदलता है
}
int main() {
int *arr = NULL;
allocate(&arr, 10); // डबल पॉइंटर पास किया
// अब arr 10 इंटीजर्स की ओर इशारा करता है
free(arr);
return 0;
}