2010-04-29 18 views

उत्तर

21

प्रकार रूपांतरण के परिणाम हमेशा एक rvalue है। रावल्यू को असाइन नहीं किया जा सकता है, यही कारण है कि आपकी पहली अभिव्यक्ति संकलित नहीं होती है। रावल्यू का पता नहीं लिया जा सकता है, यही कारण है कि आपकी दूसरी अभिव्यक्ति संकलित नहीं होती है।

आदेश सही प्रकार रूपांतरण करने के लिए, आप के रूप में

p = (char *) &l; 

यह आप अपने दूसरे अभिव्यक्ति में करने की कोशिश की कि क्या करना है उचित तरीका है इस प्रकार यह करने के लिए किया है। यह int * पॉइंटर को char * प्रकार में परिवर्तित करता है।

आपकी पहली अभिव्यक्ति मरम्मत से परे है।आप

*(int **) &p = &l; 

लेकिन क्या यह अंत में करता है वास्तव में एक रूपांतरण, बल्कि पुनर्व्याख्या स्मृति int * सूचक के रूप में char * सूचक के कब्जे की नहीं है कर सकते हैं। यह एक बदसूरत अवैध हैक है कि ज्यादातर समय बहुत कम व्यावहारिक मूल्य है।

+0

अरे idping आपके टाइपिंग (int **) ,, जिसका अर्थ है (int **) –

+0

पॉइंटर-टू-पॉइंटर। जैसा कि उस उत्तर में कहा गया है, यह सिर्फ एक बदसूरत चाल है। –

+0

मदद के लिए धन्यवाद –

6

ऐसा करने का सही तरीका यह होगा:

int I = 65; 
char* p = (char*)&I; 

&I आप एक int* कि I के लिए अंक देता है; फिर आप इसे char* पर डालें और इसे p पर असाइन करें।

ध्यान दें कि आपको सामान्य रूप से असंबंधित प्रकार के पॉइंटर्स के बीच नहीं डालना चाहिए। किसी भी ऑब्जेक्ट तक पहुंचने के लिए char* का उपयोग किया जा सकता है, हालांकि, इस विशेष मामले में यह सुरक्षित है।

+0

विशेष रूप से, सी 99 6.3.2.3.7 के अनुसार, एक प्रकार के पॉइंटर को एक अलग प्रकार के पॉइंटर में परिवर्तित करने का व्यवहार केवल तभी अनिर्धारित होता है जब प्रश्न वाले पॉइंटर्स के पास अलग-अलग संरेखण होते हैं। यह कहना जारी रखता है कि जब किसी ऑब्जेक्ट के पॉइंटर को पॉइंटर में वर्ण प्रकार में परिवर्तित किया जाता है, तो परिणाम ऑब्जेक्ट के निम्नतम बाइट को इंगित करता है। – dreamlax

+0

@ ड्रीमलैक्स: असल में, मैं सी 99 §6.5/7 के बारे में सोच रहा था, जो एलियासिंग नियमों का विवरण देता है। कनवर्ट करने वाले पॉइंटर्स अपरिभाषित परिणामों का कारण नहीं बन सकते हैं, लेकिन ऑब्जेक्ट की ओर इशारा करते हुए। –

0

सादे सी में, जो रूपांतरण टाइप करने के लिए सख्त नहीं है, यह कोड संकलित और वास्तव में काम करेगा। एक सी ++ कंपाइलर पर इसे वास्तव में पहले से उल्लिखित स्पष्ट कस्टों की आवश्यकता होगी (अन्य उत्तरों देखें)।

+1

नहीं, यह सादा सी में भी काम नहीं करता है। एक कास्ट ऑपरेटर का नतीजा सिर्फ '+' के परिणाम की तरह है - आप वही कारण नहीं कर सकते हैं, क्योंकि आप '& ((+)) नहीं कर सकते हैं। – caf

+0

एचएम। मुझे नहीं पता क्यों, लेकिन msvs2008 इस कोड को संकलित करता है और डीबग दिखाता है कि यह वास्तव में काम करता है। अजीब। –

3

(int *) p = & l;

रेखा से ऊपर काम नहीं करता है, क्योंकि जैसे ही आप के लिए (int *) पी डाली, परिणाम एक गुमनाम अस्थायी वस्तु है, जो एक rvalue और नहीं lvalue एक है, अंततः, परिणाम असाइनमेंट प्राप्त नहीं कर सकता है, और यहां तक ​​कि अगर भाषा ने इसे अनुमति दी है, तो आप मूल पी के लिए पी की एक अस्थायी जाली प्रति को असाइन करेंगे।

पी = & ((चार) एल);

उपर्युक्त पंक्ति इसी कारण से काम नहीं करती है; (char) l का नतीजा एक अस्थायी वस्तु है जो कि प्रकार चार में डाली गई एल की एक प्रति है। नतीजतन, क्योंकि यह एक अस्थायी है, आप इसका पता नहीं ले सकते हैं।

इनसीड, तो आप उपयोग कर सकते हैं:

p = (char*) &l 
0

समस्या यह है कि जब आप कास्ट कर रहे हैं (चाहे आप जिस तरह का कास्टिंग कर रहे हैं या नहीं, यह एक अच्छा विचार है या नहीं) यह है कि कास्ट अभिव्यक्ति का परिणाम एक रैल्यू में होता है।

राजस्व को उनके जोड़ों को असाइन नहीं किया जा सकता है या नहीं किया जा सकता है।

संबंधित मुद्दे