नोट: यह उत्तर C भाषा पर लागू होता है, C ++ पर नहीं।
अशक्त संकेत
पूर्णांक स्थिरांक का शाब्दिक 0
अर्थ उस संदर्भ के आधार पर अलग-अलग होता है जिसमें इसका उपयोग किया जाता है। सभी मामलों में, यह अभी भी मूल्य के साथ पूर्णांक स्थिर है 0
, यह सिर्फ अलग-अलग तरीकों से वर्णित है।
यदि एक पॉइंटर को निरंतर शाब्दिक की तुलना में किया जा रहा है 0
, तो यह देखने के लिए एक जांच है कि क्या सूचक एक अशक्त पॉइंटर है। यह 0
तब एक अशक्त सूचक के रूप में संदर्भित किया जाता है। C मानक परिभाषित करता है कि 0
टाइप करने के लिए डाली void *
एक अशक्त सूचक और अशक्त सूचक स्थिरांक है।
इसके अतिरिक्त, पठनीयता में मदद करने के लिए, NULL
हेडर फ़ाइल में मैक्रो प्रदान किया जाता है stddef.h
। आपके संकलक के आधार पर यह संभव हो सकता है #undef NULL
और इसे कुछ निराला करने के लिए फिर से परिभाषित कर सकता है ।
इसलिए, यहां एक शून्य सूचक की जांच करने के कुछ मान्य तरीके दिए गए हैं:
if (pointer == NULL)
NULL
एक अशक्त सूचक के बराबर तुलना करने के लिए परिभाषित किया गया है। इसे लागू करना यह परिभाषित करता है कि वास्तविक परिभाषा क्या NULL
है, जब तक कि यह एक वैध नल सूचक स्थिरांक है।
if (pointer == 0)
0
अशक्त सूचक का एक और प्रतिनिधित्व है।
if (!pointer)
यह if
कथन स्पष्ट रूप से "0 नहीं है" की जाँच करता है, इसलिए हम इसका मतलब यह है कि "0 है"।
शून्य सूचक के लिए जाँच करने के लिए निम्न तरीके हैं:
int mynull = 0;
<some code>
if (pointer == mynull)
कंपाइलर के लिए यह अशक्त सूचक के लिए चेक नहीं है, लेकिन दो चर पर एक समानता की जांच है। यह काम कर सकता है यदि mynull कोड में कभी नहीं बदलता है और कंपाइलर ऑप्टिमाइज़ेशन निरंतर 0 को if स्टेटमेंट में फोल्ड करता है, लेकिन इसकी गारंटी नहीं है और कंपाइलर को C Standard के अनुसार कम से कम एक डायग्नोस्टिक मैसेज (चेतावनी या त्रुटि) का उत्पादन करना पड़ता है।
ध्यान दें कि सी भाषा में एक अशक्त सूचक क्या है। यह अंतर्निहित वास्तुकला पर कोई फर्क नहीं पड़ता। यदि अंतर्निहित आर्किटेक्चर में अशक्त सूचक मान 0xDEADBEEF के रूप में परिभाषित किया गया है, तो यह इस गड़बड़ को सुलझाने के लिए कंपाइलर पर निर्भर है।
इस तरह, इस अजीब वास्तुकला पर भी, निम्न तरीके अभी भी एक शून्य सूचक की जांच करने के वैध तरीके हैं:
if (!pointer)
if (pointer == NULL)
if (pointer == 0)
शून्य सूचक के लिए जाँच करने के लिए निम्न तरीके हैं:
#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
क्योंकि ये एक कंपाइलर द्वारा सामान्य तुलना के रूप में देखे जाते हैं।
अशक्त वर्ण
'\0'
को एक अशक्त चरित्र के रूप में परिभाषित किया गया है - यह एक ऐसा चरित्र है जिसमें सभी बिट्स शून्य पर सेट हैं। इसका संकेत देने वालों से कोई लेना-देना नहीं है। हालाँकि आप इस कोड के समान कुछ देख सकते हैं:
if (!*string_pointer)
जाँचता है कि स्ट्रिंग सूचक एक अशक्त चरित्र की ओर इशारा कर रहा है
if (*string_pointer)
जाँचता है कि स्ट्रिंग सूचक एक गैर-अशक्त चरित्र की ओर इशारा कर रहा है
इन अशक्त बिंदुओं के साथ भ्रमित मत हो। सिर्फ इसलिए कि बिट प्रतिनिधित्व समान है, और यह मामलों में कुछ सुविधाजनक क्रॉस के लिए अनुमति देता है, वे वास्तव में एक ही चीज नहीं हैं।
इसके अतिरिक्त, '\0'
मान शून्य के साथ इस मामले में (सभी वर्ण शाब्दिक की तरह) एक पूर्णांक स्थिरांक है। तो '\0'
पूरी तरह से एक अनियंत्रित 0
पूर्णांक स्थिरांक के बराबर है - एकमात्र अंतर इस इरादे में है कि यह एक मानव पाठक ("मैं इसे एक अशक्त चरित्र के रूप में उपयोग कर रहा हूं") तक पहुंचाता हूं।
संदर्भ
अधिक के लिए comp.lang.c के प्रश्न 5.3 देखें । C मानक के लिए इस pdf को देखें । अनुभाग 6.3.2.3 अंक, पैराग्राफ 3 देखें।