कैसे शून्य है * a = & एक कानूनी?


88

निम्नलिखित C ++ कोड पर विचार करें:

void* a = &a;

संकलक एक अघोषित पहचानकर्ता का उपयोग करने के लिए शिकायत क्यों नहीं करता है?

इसके अलावा, संकलक चर aको क्या मानता है? क्या यह एक शून्य वस्तु के लिए एक संकेतक है या यह एक सूचक के लिए एक void*संकेतक है?




15
उल्लेख करना चाहिए कि आप ऐसा क्यों करना चाहते हैं - स्टैक के शीर्ष पर एक पॉइंटर प्राप्त करने के लिए (जिसमें से आप सभी प्रकार की चीजों के साथ फील कर सकते हैं)।
ऑरेंजडॉग

जवाबों:


95

C ++ में वेरिएबल्स की घोषणा की गुंजाइश काफी आश्चर्यजनक हो सकती है:

void* a =               &a;
         ^~~~~~~~~~~~~~~~~
          a declared as `void*` from here on

इसलिए, &aहै void**, लेकिन किसी भी सूचक प्रकार के बाद से परोक्ष के लिए परिवर्तनीय है void*...


मैं इसके लिए एक उपयोगी वस्तु कैसे प्रदान करूंगा?
user2681063

22
@ user2681063 a = &userfulObject?
निकोस सी।

4
@MarkGarcia: ध्यान दें कि void *a = a;स्थानीय रूप से घोषित किए जाने पर UB होगा, अन्यथा यह नाम स्थान के दायरे में ठीक है।
नवाज

1
@ TheodorosChatzigiannakis: मेरा मानना ​​है कि यह है, हाँ।
मैथ्यू एम।

1
एक कल्पना उद्धरण वास्तव में यहाँ अच्छा होगा।
बेंजामिन ग्रुएनबाम

30

के बराबर है

void* a;
a = &a;

इसलिए aघोषित किया गया है। तो aमें aलिखे का पता मिल जाता है a। तो यह एक शून्य सूचक के लिए एक संकेतक है। (आपने अभी तक किसी भी ऑब्जेक्ट को परिभाषित नहीं किया है।)


9
तकनीकी रूप से, आपने एक वस्तु को परिभाषित किया है। aअपने आप में एक वस्तु है। (सभी वस्तुओं में C ++ में उपयोगकर्ता-परिभाषित प्रकार नहीं हैं)
MSalters

1
@ आप यह बात करते हैं कि यह 'वस्तु' क्या है? : D
Gusdor

3
@Gusdor हम केवल वही मान सकते हैं जो घटना क्षितिज के शून्य से परे है।
कोल जॉनसन

उन्हें अलग तरह से कहा जाता है, हालांकि इस मामले में "प्रभाव" एक ही है
स्टासिक

वे सामान्य रूप से समान नहीं हैं, लेकिन इस परिदृश्य में वे हैं।
ऑर्बिट

7

में void* a, aएक पॉइंटर के रूप में घोषित किया जाता है , न voidकि "किसी भी प्रकार" (विशेष मामले) के लिए। एक पता (स्मृति में स्थिति) को सौंपा गया है a, जैसा कि किसी अन्य चर को घोषित किया जा रहा है।

उसके बाद, &aचर को शुरू करने के लिए अभिव्यक्ति का मूल्यांकन किया जाता है (यह भी a, लेकिन यह प्रासंगिक नहीं है) बस घोषित किया गया है। का प्रकार &a"किसी भी प्रकार के लिए पॉइंटर को पॉइंटर" है, जो "किसी भी प्रकार के पॉइंटर" का एक विशेष मामला है, के प्रकार के साथ पूरी तरह से संगत है a। एर्गो, कोई संकलक संदेश नहीं।

कोरोलरी: void*यदि आप मजबूत प्रकार की जाँच करना चाहते हैं तो इसका उपयोग न करें । किसी भी चीज को इसमें बदला जा सकता है। केवल विपरीत दिशा में विपरीत, void*खुद को छोड़कर (यह एक अनावश्यक अपवाद होगा कि एक प्रकार खुद के साथ असंगत था)।

इसके अलावा, AFAIR यह वास्तव में C से आता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.