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

C++ में डैंगलिंग, वॉयड, नल और वाइल्ड पॉइंटर्स

डैंगलिंग पॉइंटर

डैंगलिंग पॉइंटर एक ऐसा पॉइंटर है जो उस मेमोरी लोकेशन की ओर इशारा करता है जिसे मुक्त (या डिलीट) कर दिया गया है। ऐसे विभिन्न तरीके हैं जहां पॉइंटर डैंगलिंग पॉइंटर के रूप में कार्य करता है।

फंक्शन कॉल

लोकल वेरिएवल की ओर इशारा करने वाला पॉइंटर डैंगलिंग हो जाता है जब लोकल वेरिएवल स्टैटिक नहीं होता।

int *show(void) {
    int n = 76; /* ... */
    return &n;
}

आउटपुट

इस प्रोग्राम का आउटपुट गार्बेज एड्रेस होगा।

मेमोरी का डी-एलोकेशन

int main() {
    float *p = (float *)malloc(sizeof(float));
    //डायनामिक मेमोरी एलोकेशन।
    free(p);
    //free() कॉल करने के बाद
    //p एक डैंगलिंग पॉइंटर बन जाता है
    p = NULL;
    //अब p डैंगलिंग पॉइंटर नहीं है।
}

वेरिएवल स्कोप से बाहर जाता है

int main() {
    int *p //कुछ कोड//
    {
        int c; p=&c;
    }
    //कुछ कोड//
    //p यहां डैंगलिंग पॉइंटर है।
}

वॉयड पॉइंटर

वॉयड पॉइंटर एक ऐसा पॉइंटर है जो किसी भी डेटा टाइप से जुड़ा नहीं होता। यह स्टोरेज में किसी डेटा लोकेशन की ओर इशारा करता है यानी वेरिएवल्स के पते की ओर इशारा करता है। इसे जनरल पर्पस पॉइंटर भी कहा जाता है।

इसकी कुछ सीमाएं हैं

  • इसके ठोस आकार के कारण वॉयड पॉइंटर का पॉइंटर अंकगणित संभव नहीं है।
  • इसे डीरेफरेंस के रूप में उपयोग नहीं किया जा सकता।

उदाहरण

#include<stdlib.h>
#include<iostream>
using namespace std;

int main() {
    int a = 7;
    float b = 7.6;
    void *p;
    p = &a;
    cout<<*( (int*) p)<<endl ;
    p = &b;
    cout<< *( (float*) p) ;
    return 0;
}

आउटपुट

7
7.600000

एल्गोरिदम

Begin
    एक वेरिएवल a को इंटीजर मान से और वेरिएवल b को फ्लोट मान से आरंभ करें।
    एक वॉयड पॉइंटर p घोषित करें।
    (int*)p = वॉयड का टाइप कास्टिंग।
    p = &b का अर्थ है वॉयड पॉइंटर p अब फ्लोट है।
    (float*)p = वॉयड का टाइप कास्टिंग।
    मान प्रिंट करें।
End.

नल पॉइंटर

नल पॉइंटर एक ऐसा पॉइंटर है जो कुछ भी नहीं दर्शाता।

नल पॉइंटर के कुछ उपयोग हैं

  • पॉइंटर वेरिएवल को आरंभ करने के लिए जब वह पॉइंटर वेरिएवल अभी तक किसी वैध मेमोरी एड्रेस को असाइन नहीं किया गया है।

  • एक फंक्शन आर्गुमेंट को नल पॉइंटर पास करने के लिए यदि हम कोई वैध मेमोरी एड्रेस पास नहीं करना चाहते।

  • किसी भी पॉइंटर वेरिएवल को एक्सेस करने से पहले नल पॉइंटर की जांच करने के लिए। ताकि हम पॉइंटर से संबंधित कोड में त्रुटि प्रबंधन कर सकें, जैसे पॉइंटर वेरिएवल को केवल तभी डीरेफरेंस करें जब यह NULL न हो।

उदाहरण

#include <iostream>
using namespace std;

int main() {
    int *p= NULL; //पॉइंटर को नल के रूप में आरंभ करें।
    cout<<"The value of pointer is ";
    cout<<p;
    return 0;
}

आउटपुट

The value of pointer is 0.

वाइल्ड पॉइंटर

वाइल्ड पॉइंटर्स वे पॉइंटर्स हैं जो किसी मनमाने मेमोरी लोकेशन की ओर इशारा करते हैं। (नल भी नहीं)

int main() {
    int *ptr; //वाइल्ड पॉइंटर
    *ptr = 5;
}
  1. C++ में प्रत्येक नोड II में अगले राइट पॉइंटर्स भरना C++ में प्रत्येक नोड II में अगले राइट पॉइंटर्स भरना

    मान लीजिए हमारे पास एक बाइनरी ट्री है, जहां प्रत्येक नोड में निम्नलिखित फ़ील्ड हैं: (data, left, right, next), left बाएं उपट्री की ओर इंगित करेगा, right दाएं उपट्री की ओर इंगित करेगा, और next पॉइंटर अगले नोड की ओर इंगित करेगा। यदि दाएं हाथ की तरफ कोई नोड नहीं है, तो वह null होगा। इसलिए प्रारंभ में प

  1. C++ में प्रत्येक नोड में अगले राइट पॉइंटर्स भरना C++ में प्रत्येक नोड में अगले राइट पॉइंटर्स भरना

    मान लीजिए हमारे पास एक पूर्ण बाइनरी ट्री है, जहां प्रत्येक नोड में निम्नलिखित फ़ील्ड हैं: (data, left, right, next), left बाएं उपट्री की ओर इंगित करेगा, right दाएं उपट्री की ओर इंगित करेगा, और next पॉइंटर अगले नोड की ओर इंगित करेगा। यदि दाएं हाथ की तरफ कोई नोड नहीं है, तो वह null होगा। इसलिए प्रारंभ

  1. - स्मार्ट पॉइंटर क्या है और C++ में इसका उपयोग कब करना चाहिए?

    स्मार्ट पॉइंटर एक क्लास है जो रॉ (या बेयर) C++ पॉइंटर को लपेटती है। इसका उपयोग उन रिसोर्सेज को प्रबंधित करने के लिए किया जाता है जिनकी ओर पॉइंटर इंगित करता है। उदाहरण के लिए, यदि उस मेमोरी स्थान का रेफरेंस खो जाता है। यह एक तरह से गार्बेज कलेक्टर की तरह कार्य करता है। कई स्मार्ट पॉइंटर टाइप्स हैं।