Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C भाषा में पॉइंटर टू पॉइंटर (Double Pointer) और वॉइड पॉइंटर

पॉइंटर टू पॉइंटर (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 वॉइड पॉइंटर लेते हैं
  • डायनामिक मेमोरी: malloc void* लौटाता है
  • कॉलबैक: जेनेरिक डेटा पास करना
  • पॉलीमॉर्फिज्म अनुकरण: विभिन्न प्रकारों को संभालना

उदाहरण: जेनेरिक स्वैप फ़ंक्शन

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
}

सावधानियां

  • वॉइड पॉइंटर पर पॉइंटर अंकगणित अनुमत नहीं (आकार अज्ञात)
  • डीरेफरेंस करने से पहले हमेशा कास्ट करें
  • गलत कास्ट → अनिर्धारित व्यवहार
  1. C भाषा में कैरेक्टर ऑपरेशन्स को समझें C भाषा में कैरेक्टर ऑपरेशन्स को समझें

    C प्रोग्रामिंग भाषा में कैरेक्टर (A-Z या a-z), अंक (0-9), व्हाइट स्पेस, या विशेष प्रतीक हो सकते हैं। घोषणा (Declaration) C प्रोग्रामिंग में कैरेक्टर ऑपरेशन्स के लिए घोषणा निम्नलिखित है: char a = A; // कैरेक्टर कॉन्स्टेंट का उपयोग करके कैरेक्टर इनपुट/आउटपुट फंक्शन्स कैरेक्टर इनपुट/आउटपुट फंक्शन्स

  1. C भाषा में यूनियन टू पॉइंटर (Union to Pointer) C भाषा में यूनियन टू पॉइंटर (Union to Pointer)

    यूनियन (Union) क्या है? यूनियन एक यूजर-डिफाइंड डेटा प्रकार है जो एक ही मेमोरी स्थान को विभिन्न डेटा प्रकारों के सदस्यों के लिए साझा करने की अनुमति देता है। किसी भी समय केवल एक सदस्य ही मान रख सकता है। यूनियन की घोषणा union यूनियन_नाम { डेटा_प्रकार सदस्य1; डेटा_प्रकार सदस्य2; // ... };

  1. C भाषा में पॉइंटर एक्सेस करने की अवधारणा C भाषा में पॉइंटर एक्सेस करने की अवधारणा

    पॉइंटर घोषणा, प्रारंभिकरण और एक्सेस 1. सामान्य चर int qty = 179; // मेमोरी में: पता 1000 पर मान 179 संग्रहीत 2. पॉइंटर घोषणा int *p; // p एक पॉइंटर चर है जो int का पता रख सकता है 3. पॉइंटर प्रारंभिकरण int qty = 175; int *p; p = &qty; // एड्रेस-ऑफ ऑपरेटर (&) से पता प्राप्त करें मेमोरी आर