पॉइंटर टू पॉइंटर (Double Pointer)
डबल पॉइंटर या पॉइंटर टू पॉइंटर एक चर है जो दूसरे पॉइंटर का पता रखता है।
घोषणा
डेटा_प्रकार **पॉइंटर_नाम;
उदाहरण: int **p; // p एक पॉइंटर टू पॉइंटर है
प्रारंभिकरण
int a = 10;
int *p;
int **q;
p = &a; // p, a का पता रखता है
q = &p; // q, p का पता रखता है
एक्सेस करना
इंडायरेक्शन ऑपरेटर (*) का उपयोग:
*p→ a का मान (10)**q→ a का मान (10)*q→ p का मान (a का पता)
प्रोग्राम: पॉइंटर टू पॉइंटर
#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);
// पते भी प्रिंट करें
printf("\nपते:\n");
printf("&A = %p\n", (void*)&A);
printf("p = %p\n", (void*)p);
printf("q = %p\n", (void*)q);
printf("*q = %p\n", (void*)*q);
return 0;
}
आउटपुट
A = 10
A का मान पॉइंटर के माध्यम से = 10
A का मान डबल पॉइंटर के माध्यम से = 10
पते:
&A = 0x7ffc1234567c
p = 0x7ffc1234567c
q = 0x7ffc12345670
*q = 0x7ffc1234567c
उपयोग मामले: डबल पॉइंटर
- 2D सरणी डायनामिक आवंटन:
int **arr = malloc(rows * sizeof(int*)); - फ़ंक्शन में पॉइंटर संशोधित करना: लिंक्ड लिस्ट हेड बदलना
- कमांड लाइन आर्गुमेंट्स:
char **argv - स्ट्रिंग्स की सरणी:
char *names[]→char **names
वॉइड पॉइंटर (Void Pointer)
यह एक प्रकार का पॉइंटर है जो किसी भी डेटा प्रकार के चर का पता रख सकता है (या किसी भी डेटा प्रकार को इंगित कर सकता है)।
घोषणा
void *पॉइंटर_नाम;
उदाहरण: void *vp;
एक्सेस करना
टाइप कास्ट ऑपरेटर का उपयोग करके मान एक्सेस करें:
*( (टाइप_कास्ट) वॉइड_पॉइंटर )
उदाहरण
int i = 10;
void *vp;
vp = &i;
printf("%d", *((int*)vp)); // टाइप कास्ट: (int*) फिर डीरेफरेंस *
प्रोग्राम: वॉइड पॉइंटर
#include <stdio.h>
int main() {
int i = 10;
float f = 5.34;
void *vp;
vp = &i;
printf("i = %d\n", *((int*)vp));
vp = &f;
printf("f = %f\n", *((float*)vp));
// वॉइड पॉइंटर का आकार
printf("वॉइड पॉइंटर आकार: %zu बाइट्स\n", sizeof(vp));
return 0;
}
आउटपुट
i = 10
f = 5.34
वॉइड पॉइंटर आकार: 8 बाइट्स (64-बिट सिस्टम पर)
वॉइड पॉइंटर के उपयोग
- जेनेरिक फ़ंक्शन:
qsort,bsearchवॉइड पॉइंटर लेते हैं - डायनामिक मेमोरी:
mallocvoid*लौटाता है - कॉलबैक: जेनेरिक डेटा पास करना
- पॉलीमॉर्फिज्म अनुकरण: विभिन्न प्रकारों को संभालना
उदाहरण: जेनेरिक स्वैप फ़ंक्शन
void swap(void *a, void *b, size_t size) {
char *pa = (char*)a;
char *pb = (char*)b;
char temp;
for (size_t i = 0; i < size; i++) {
temp = pa[i];
pa[i] = pb[i];
pb[i] = temp;
}
}
int main() {
int x = 10, y = 20;
float a = 1.5, b = 2.5;
swap(&x, &y, sizeof(int));
swap(&a, &b, sizeof(float));
// अब x=20, y=10, a=2.5, b=1.5
}
सावधानियां
- वॉइड पॉइंटर पर पॉइंटर अंकगणित अनुमत नहीं (आकार अज्ञात)
- डीरेफरेंस करने से पहले हमेशा कास्ट करें
- गलत कास्ट → अनिर्धारित व्यवहार