पॉइंटर एक वेरिएबल है जो दूसरे वेरिएबल का पता संग्रहीत करता है।
सिंटैक्स
pointer = &variable;
पॉइंटर्स के प्रकार
आठ विभिन्न प्रकार के पॉइंटर्स होते हैं:
- नल पॉइंटर
- वॉइड पॉइंटर
- वाइल्ड पॉइंटर
- डैंगलिंग पॉइंटर
- कॉम्प्लेक्स पॉइंटर
- नियर पॉइंटर
- फार पॉइंटर
- ह्यूज पॉइंटर
1. नल पॉइंटर (Null Pointer)
पॉइंटर घोषणा के समय नल मान असाइन करके बनाया जाता है। जब आप पॉइंटर को कोई पता असाइन नहीं करना चाहते, तो यह उपयोगी है। एक नल पॉइंटर में हमेशा मान 0 होता है।
उदाहरण
#include <stdio.h>
int main() {
int *ptr = NULL; // नल पॉइंटर
printf("Value inside ptr: %p\n", (void*)ptr);
return 0;
}
आउटपुट
Value inside ptr: (nil)
2. वॉइड पॉइंटर (Void Pointer)
- इससे कोई डेटा टाइप जुड़ा नहीं होता।
- किसी भी प्रकार का पता रख सकता है और किसी भी प्रकार में टाइपकास्ट किया जा सकता है।
- इसे जेनेरिक पॉइंटर भी कहते हैं।
voidकीवर्ड से बनाया जाता है।
उदाहरण
#include <stdio.h>
int main() {
void *p = NULL; // वॉइड पॉइंटर
printf("Size of pointer: %zu bytes\n", sizeof(p));
return 0;
}
आउटपुट (64-बिट सिस्टम)
Size of pointer: 8
उपयोग उदाहरण
void printValue(void *ptr, char type) {
switch(type) {
case 'i': printf("%d", *(int*)ptr); break;
case 'f': printf("%f", *(float*)ptr); break;
case 'c': printf("%c", *(char*)ptr); break;
}
}
3. वाइल्ड पॉइंटर (Wild Pointer)
- अनइनिशियलाइज़्ड पॉइंटर्स को वाइल्ड पॉइंटर्स कहते हैं।
- ये मनमाने मेमोरी लोकेशन पर इंगित करते हैं और प्रोग्राम को क्रैश कर सकते हैं या खराब व्यवहार कर सकते हैं।
- इस प्रकार का C पॉइंटर कुशल नहीं है।
- वाइल्ड पॉइंटर्स के साथ काम करते समय सावधानी बरतने की सलाह दी जाती है।
उदाहरण
#include <stdio.h>
int main() {
int *p; // वाइल्ड पॉइंटर - अनइनिशियलाइज़्ड
// printf("%d", *p); // अपरिभाषित व्यवहार - क्रैश या गार्बेज
p = NULL; // सुरक्षित: नल असाइन करें
return 0;
}
4. डैंगलिंग पॉइंटर (Dangling Pointer)
- वह पॉइंटर जो पहले से मुक्त (freed) की गई मेमोरी को इंगित करता है।
free()याdeleteके बाद पॉइंटर को NULL नहीं करने पर होता है।
उदाहरण
int *ptr = malloc(sizeof(int)); free(ptr); // ptr अब डैंगलिंग पॉइंटर है ptr = NULL; // ठीक करें: मुक्त करने के बाद NULL असाइन करें
5. कॉम्प्लेक्स पॉइंटर (Complex Pointer)
फंक्शन पॉइंटर्स, पॉइंटर्स की सरणी, पॉइंटर-टू-पॉइंटर आदि जैसे जटिल घोषणाएं।
int (*fp)(int, int); // फंक्शन पॉइंटर int *arr[10]; // पॉइंटर्स की सरणी int **ptr2; // पॉइंटर-टू-पॉइंटर int (*pa)[10]; // सरणी का पॉइंटर
6-8. नियर, फार, ह्यूज पॉइंटर्स
ये 16-बिट सेगमेंटेड आर्किटेक्चर (DOS/8086) के लिए विशिष्ट हैं। आधुनिक 32/64-बिट सिस्टम्स में अप्रचलित।
- नियर: 16-बिट, 64KB सेगमेंट
- फार: 32-बिट, सेगमेंट:ऑफसेट, 1MB
- ह्यूज: 32-बिट, रैखिक एड्रेसिंग
अन्य महत्वपूर्ण पॉइंटर प्रकार
| प्रकार | विवरण |
|---|---|
| फंक्शन पॉइंटर | फंक्शन का पता संग्रहीत करता है |
| पॉइंटर-टू-पॉइंटर | दूसरे पॉइंटर का पता (int **ptr) |
| सरणी का पॉइंटर | पूरी सरणी की ओर इंगित करता है (int (*p)[N]) |
| कॉन्स्ट पॉइंटर | पता नहीं बदल सकता (int *const p) |
| पॉइंटर टू कॉन्स्ट | मान नहीं बदल सकता (const int *p) |
सारांश
- आधुनिक C में मुख्य रूप से: नल, वॉइड, फंक्शन पॉइंटर, पॉइंटर-टू-पॉइंटर, कॉन्स्ट पॉइंटर्स उपयोगी हैं।
- हमेशा पॉइंटर्स इनिशियलाइज़ करें (
NULLया वैध पता)। void*जेनेरिक कोड (जैसेmemcpy,qsort) के लिए आवश्यक है।