2011-10-12 16 views
7

क्या निम्न कार्य मान्य हैं? या इनमें से कोई भी समस्या पैदा करेगा। कृपया सुझाव दे।कॉन्स चार सूचक असाइनमेंट

const char * c1; 
const char * c2; 
const char * c3; 
char * c4; 

c2 = c1; 
c2 = c3; 
c2 = c4; 

यदि मैं निम्नलिखित करता हूं, तो क्या करना ठीक है?

const char * c5 = "xyz"; 
char * c6 = "abc"; 

c2 = c5; 
c2 = c6; 
+0

@ क्षितिज मेहता - होमवर्क नहीं, हम अपने विशाल कोड बेस के साथ स्मृति समस्या का सामना कर रहे हैं। तो कृपया किसी भी मदद की सराहना की जाएगी। – user32262

+0

@user आपने एक ही प्रश्न से कुछ बार पूछा है। हमने उन्हें उत्तर दिया है। इस प्रश्न में आपका संपादन कुछ भी नहीं जोड़ता है। यह सिर्फ ऊपर बताए गए दोहराता है। –

+1

अगर मैं एक ही बात पूछ रहा हूं तो मैं क्षमा चाहता हूं। शायद पॉइंटर्स के साथ मेरी समझ सटीक नहीं है। – user32262

उत्तर

9

सभी वैध बयान के साथ ही उन्हें अपने आप भिन्नता नहीं है क्योंकि सभी संकेत uninitalized छोड़ दिया जाता है या किसी वैध मेमोरी स्थानों की ओर इशारा करते नहीं हैं।

और वे मान्य हैं क्योंकि सूचक स्थिर नहीं है लेकिन सूचक द्वारा इंगित मूल्य स्थिर है। तो, यहां पॉइंटर्स एक अलग स्थान पर इंगित करने के लिए पुन: असाइन करने योग्य हैं।

3

ये असाइनमेंट पूरी तरह मान्य हैं क्योंकि मैंने और अन्य ने आपके हाल के समान प्रश्नों के हालिया भाग में समझाया है।

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

30

आपके दिमाग में क्षुद्रग्रह के माध्यम से एक रेखा खींचें। सूचक p स्थिर है और इतने अक्षर हैं जो करने के लिए p अंक हैं - - यानी दोनों को बदल नहीं सकते बाईं ओर क्या करने के लिए और सही सूचक

किस प्रकार उदाहरण के लिए

  1. const char * const p की ओर इशारा किया जा रहा है सूचकांक और सामग्री p
  2. const char * p - p निरंतर वर्णों के लिए अंक। आप p के मान को बदल सकते हैं और इसे विभिन्न निरंतर वर्णों पर इंगित करने के लिए प्राप्त कर सकते हैं। लेकिन जो भी p अंक, आप सामग्री को बदल नहीं सकते हैं।
  3. char * const p - आप सूचक बदलने में असमर्थ हैं, लेकिन उनकी सामग्री

और अंत में

  1. char * p बदल सकते हैं - सब कुछ पकड़ लेता है

आशा है कि मदद करता है के लिए निर्भर है।

+0

क्या आपके पहले उदाहरण में 2 * एस होना है? –

+0

बहुत स्पष्ट। अच्छा लेख। मैं सिर्फ इस बारे में सोच रहा था कि मैं एक इनपुट तर्क के रूप में 'कॉन्स्ट char * ptr' क्यों बदल सकता हूं, और यह पूरी तरह स्पष्ट हुआ। मैं 40 मिनट के लिए वोटों से बाहर हूं, इसलिए मैं उसके बाद ++ करूंगा। – stevieb

0

ये सभी वैध हैं, केवल समस्याग्रस्त रेखा char * c6 = "abc"; है: यहां "एबीसी" एक स्थिरांक है इसलिए इसे गैर-कॉन्स्ट पॉइंटर को असाइन करना सुरक्षित नहीं है, और संकलन त्रुटि नहीं होने पर कम से कम चेतावनी उत्पन्न करनी चाहिए (मैंने इसे संकलित करने की कोशिश नहीं की थी)।

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