c++ "Int*ptr=int()" मान प्रारंभिक कैसे अवैध नहीं है?




visual-c++ pointers (4)

निम्नलिखित कोड ( यहां से लिया गया ):

int* ptr = int();

विजुअल सी ++ में संकलित करता है और पॉइंटर को मूल्य-प्रारंभ करता है।

वो कैसे संभव है? मेरा मतलब है int() प्रकार int की वस्तु उत्पन्न करता है और मैं एक सूचक को एक int असाइन नहीं कर सकता।

उपरोक्त कोड अवैध नहीं है?


int() 0 के मान के साथ निरंतर अभिव्यक्ति है, इसलिए यह एक शून्य सूचक स्थिरांक का एक वैध तरीका है। आखिरकार, यह int *ptr = NULL; कहने का थोड़ा अलग तरीका int *ptr = NULL;


एन 32 9 0 से (सी ++ 03 समान पाठ का उपयोग करता है), 4.10 पॉइंटर रूपांतरण [conv.ptr] अनुच्छेद 1 (जोर मेरा है):

1 एक शून्य सूचक स्थिरांक एक अभिन्न निरंतर अभिव्यक्ति (5.1 9) पूर्णांक प्रकार का प्रसार होता है जो शून्य या किसी प्रकार के std :: nullptr_t का मूल्यांकन करता है। एक शून्य सूचक स्थिर को एक सूचक प्रकार में परिवर्तित किया जा सकता है; नतीजा उस प्रकार का शून्य सूचक मूल्य है और ऑब्जेक्ट पॉइंटर या फ़ंक्शन पॉइंटर प्रकार के हर दूसरे मूल्य से अलग है। इस तरह के एक रूपांतरण को शून्य सूचक रूपांतरण कहा जाता है। [...]

int() इतनी अभिन्न निरंतर अभिव्यक्ति है जो पूर्णांक प्रकार का मूल्यांकन करता है जो शून्य का मूल्यांकन करता है (यह एक मुट्ठी भर है!), और इस प्रकार एक सूचक प्रकार को प्रारंभ करने के लिए उपयोग किया जा सकता है। जैसा कि आप देख सकते हैं, 0 एकमात्र अभिन्न अभिव्यक्ति नहीं है जो विशेषीकृत है।


अच्छा int एक वस्तु नहीं है।

मैं यहां क्या हो रहा हूं, यह है कि आप Int * द्वारा निर्धारित कुछ स्मृति पते को इंगित करने के लिए int * कह रहे हैं

इसलिए अगर int () 0 बनाता है, int * स्मृति पता 0 को इंगित करेगा


क्योंकि int() 0 उत्पन्न करता है, जो NULL साथ अंतर-परिवर्तनीय NULLNULL खुद को 0 रूप में परिभाषित किया गया है, सी के NULL विपरीत जो (void *) 0

ध्यान दें कि यह एक त्रुटि होगी:

int* ptr = int(5);

और यह अभी भी काम करेगा:

int* ptr = int(0);

0 एक विशेष निरंतर मूल्य है और इस तरह इसे एक सूचक मूल्य के रूप में माना जा सकता है। निरंतर अभिव्यक्ति जो 0 उत्पन्न करती हैं, जैसे कि 1 - 1 को नल-पॉइंटर स्थिरांक के रूप में भी अनुमति दी जाती है।





built-in-types