मेमोरी मॉडल्स और सेगमेंट के आधार पर, पॉइंटर्स को तीन प्रकारों में वर्गीकृत किया जाता है:
- नियर पॉइंटर
- फार पॉइंटर
- ह्यूज पॉइंटर
नोट: ये अवधारणाएं 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 में नहीं हैं और आधुनिक कंपाइलर्स द्वारा अनदेखा किए जाते हैं।