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

C भाषा में नियर, फार और ह्यूज पॉइंटर्स समझें

मेमोरी मॉडल्स और सेगमेंट के आधार पर, पॉइंटर्स को तीन प्रकारों में वर्गीकृत किया जाता है:

  • नियर पॉइंटर
  • फार पॉइंटर
  • ह्यूज पॉइंटर

नोट: ये अवधारणाएं 16-बिट आर्किटेक्चर (जैसे DOS, 8086) के लिए विशिष्ट हैं। आधुनिक 32/64-बिट सिस्टम्स में सभी पॉइंटर्स समान आकार के होते हैं (फ्लैट मेमोरी मॉडल)।

नियर पॉइंटर

  • 64KB डेटा सेगमेंट की रेंज के भीतर काम करता है।
  • उस डेटा सेगमेंट से बाहर के पते एक्सेस नहीं कर सकता।
  • अंकगणितीय ऑपरेटर्स का उपयोग करके एड्रेस रेंज इन्क्रीमेंट/डिक्रीमेंट कर सकता है।
  • near कीवर्ड से घोषित किया जाता है।

सिंटैक्स

<data type> near <pointer definition>
<data type> near <function definition>
char near *string;  // वेरिएबल s के लिए नियर पॉइंटर

प्रोग्राम: नियर पॉइंटर

#include <stdio.h> 

int main() {
    int number = 50;
    int near *p;
    p = &number;
    printf("Size of near pointer: %zu bytes\n", sizeof(p));
    return 0;
}

आउटपुट (16-बिट सिस्टम पर)

2

फार पॉइंटर

  • ऑफसेट और सेगमेंट दोनों पते संग्रहीत करता है।
  • सभी 16 सेगमेंट्स एक्सेस कर सकता है।
  • एड्रेस रेंज: 0 से 1MB (20-बिट एड्रेस)।
  • इन्क्रीमेंट/डिक्रीमेंट करने पर केवल ऑफसेट भाग बदलता है।

सिंटैक्स

<data type> far <pointer definition>
<data type> far <function definition>
char far *s;  // वेरिएबल s के लिए फार पॉइंटर

प्रोग्राम: फार पॉइंटर

#include <stdio.h> 

int main() {
    int number = 50;
    int far *p;
    p = &number;
    printf("Size of far pointer: %zu bytes\n", sizeof(p));
    return 0;
}

आउटपुट (16-बिट सिस्टम पर)

4

ह्यूज पॉइंटर

  • आकार में फार पॉइंटर के समान (32-बिट एड्रेस)।
  • फार पॉइंटर के विपरीत, सेगमेंट वर्कअराउंड के बिना इन्क्रीमेंट किया जा सकता है।
  • पूरे मेमोरी स्पेस में रैखिक एड्रेसिंग की अनुमति देता है।

प्रोग्राम: ह्यूज पॉइंटर

#include <stdio.h> 

int main() {
    char huge *far *ptr;  // सिंटैक्स नोट: huge far pointer to char
    printf("sizeof(ptr)=%zu, sizeof(*ptr)=%zu, sizeof(**ptr)=%zu\n", 
           sizeof(ptr), sizeof(*ptr), sizeof(**ptr));
    return 0;
}

आउटपुट (16-बिट सिस्टम पर)

4 4 1

तुलना तालिका (16-बिट सिस्टम्स)

विशेषतानियरफारह्यूज
आकार2 बाइट्स (16-बिट)4 बाइट्स (32-बिट)4 बाइट्स (32-बिट)
एड्रेस रेंज64KB (एक सेगमेंट)1MB (सभी सेगमेंट्स)1MB (सभी सेगमेंट्स)
सेगमेंटफिक्स्ड (DS)पॉइंटर में संग्रहीतपॉइंटर में संग्रहीत
अंकगणितऑफसेट केवलऑफसेट केवल (सेगमेंट अपरिवर्तित)पूर्ण 32-बिट (सेगमेंट+ऑफसेट)
तुलनाकेवल ऑफसेटपूर्ण पतापूर्ण पता
आधुनिक उपयोगअप्रचलितअप्रचलितअप्रचलित

आधुनिक संदर्भ

32-बिट और 64-बिट सिस्टम्स (Linux, Windows, macOS) फ्लैट मेमोरी मॉडल का उपयोग करते हैं जहां:

  • सभी पॉइंटर्स समान आकार के होते हैं (32-बिट पर 4 बाइट्स, 64-बिट पर 8 बाइट्स)।
  • कोई सेगमेंटेशन नहीं - पूरा एड्रेस स्पेस सन्निहित है।
  • near, far, huge कीवर्ड्स मानक C में नहीं हैं और आधुनिक कंपाइलर्स द्वारा अनदेखा किए जाते हैं।
  1. C प्रोग्रामिंग भाषा में पॉइंटर्स के ऐरे को समझें C प्रोग्रामिंग भाषा में पॉइंटर्स के ऐरे को समझें

    पॉइंटर एक वेरिएबल है जो दूसरे वेरिएबल का पता स्टोर करता है। विशेषताएं पॉइंटर मेमोरी स्पेस बचाता है। सीधे मेमोरी लोकेशन एक्सेस के कारण पॉइंटर का एक्जीक्यूशन टाइम तेज होता है। पॉइंटर्स की मदद से, मेमोरी को कुशलता से एक्सेस किया जाता है, यानी मेमोरी को डायनामिकली एलोकेट और डीएलोकेट किया जाता है। पॉइ

  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; // एड्रेस-ऑफ ऑपरेटर (&) से पता प्राप्त करें मेमोरी आर