वहाँ लगातार सूचक और निरंतर सूचक के बीच अंतर है। एक सूचक जिसका उठाई मूल्य नहीं बदला जा सकता है
int * const const_pointer = &some_int_var; // will be always pointing to this var
const_pointer = &some_other_var; // illegal - cannot change the pointer
*const_pointer = 2; // legal, the pointer is a pointer to non-const
सूचक लगातार करने के लिए:
- बदला नहीं जा सकता है कि वह हमेशा आरंभीकरण के माध्यम से दिए गए एक ही वस्तु को इंगित - लगातार सूचक एक सूचक (स्मृति पते के एक नंबर) है
const int * pointer_to_const = &some_int_var; // doesn't have to be always pointing to this var
pointer = &some_other_var; // legal, it's not a constant pointer and we can change it
*pointer = 2; // illegal, pointed value cannot be changed
आप हमेशा निरंतर चर यानी कॉन्स्ट पॉइंटर को गैर-कॉन्स्ट पॉइंटर (ए) में असाइन कर सकते हैं। आप पॉइंटर को कॉन्स (बी) के लिए पॉइंटर पर गैर-कॉन्स तक डाल सकते हैं। ++
int * pointer;
int * const const_pointer = &var;
const int * pointer_to_const;
/* a */
pointer = const_pointer; // OK, no cast (same type)
/* b */
pointer_to_const = pointer; // OK, casting 'int*' to 'const int*'
/* c */
pointer = pointer_to_const; // Illegal, casting 'const int*' to 'int*'
[संपादित करें] नीचे, यह नहीं मानक सी है: लेकिन आप करने के लिए गैर स्थिरांक (ग) एक सूचक को const सूचक डाली नहीं कर सकता। बहरहाल, यह आम है [/ संपादित करें]
स्ट्रिंग शाब्दिक
"Hello"
स्थिरांक (const char * const
) के लिए निरंतर सूचक में बदल जाती है।
char *pointer = "Hello"; // Illegal, cannot cast 'const char*' to 'char*'
char * const const_pointer = "Hello"; // Illegal, cannot cast 'const char*' to 'char*'
const char * pointer_to_const = "Hello"; // OK, we can assign a constant to a variable of the same type (and the type is 'const char*')
"Hello" = pointer_to_const; // Illegal cannot re-assign a constant
उपरोक्त उदाहरण में दूसरा अपने मामले है। आपने पॉइंटर-टू-गैर-कॉन्स को पॉइंटर-टू-कॉन्स के साथ प्रारंभ करने की कोशिश की, जब आपके फ़ंक्शन के तर्क के रूप में स्ट्रिंग शाब्दिक पास किया गया। इससे कोई फर्क नहीं पड़ता कि ये पॉइंटर्स स्थिर हैं या नहीं, इससे कोई फर्क नहीं पड़ता कि वे क्या इंगित करते हैं।
सारांश:
1) यदि आप किसी अन्य प्रकार का एक सूचक को किसी प्रकार की एक सूचक डाली हैं, तो आप सूचक करने वाली गैर स्थिरांक सूचक करने वाली स्थिरांक डाली नहीं कर सकता।
2) यदि आपके पास निरंतर सूचक है, तो वही नियम अन्य स्थिरांक के रूप में लागू होते हैं - आप एक चर के लिए निरंतर असाइन कर सकते हैं लेकिन आप चर को एक स्थिर (इसे प्रारंभ करने के अलावा) असाइन नहीं कर सकते हैं।
// संपादित
GMAN के रूप में बताया, सी ++ 98 मानक (§4.2/2) परोक्ष एक गैर स्थिरांक चार सूचक को स्ट्रिंग शाब्दिक (जो लगातार चार सरणियों कर रहे हैं) कास्ट करने के लिए अनुमति देता है। यह पिछड़े संगतता की वजह से है (सी भाषा में कोई स्थिरांक नहीं है)।
बेशक इस तरह के एक रूपांतरण से गलतियों का कारण बन सकता है और कंपाइलर्स नियम का उल्लंघन करेंगे और एक त्रुटि दिखाएंगे। हालांकि, संगतता मोड में जीसीसी केवल एक चेतावनी दिखाता है।
उस कोड के साथ कुछ भी गलत नहीं है, प्रति से। वास्तविक समस्या को हल करने के लिए वास्तविक संकलन त्रुटियों के साथ हमें वास्तविक कोड क्यों नहीं दिखाएं? – GManNickG
संपादन के जवाब में, "इसे संकलित करें" क्या है ... आपने संकलित कोड पोस्ट नहीं किया है। :) हमें आप जो संकलित कर रहे हैं, उसका एक छोटा सा स्निपेट दें। – GManNickG
ओह माय। यह कोड प्रत्येक पंक्ति के लिए सी ++ प्रोग्रामिंग के लगभग दो बुनियादी सिद्धांतों का उल्लंघन करता है। मुझे नहीं पता कि आपको कहां से शुरू करना है कि इसमें क्या गलत है। सी ++ से आप कौन सी पुस्तक सीख रहे हैं? जो कुछ भी है, उसे मिटाएं और लिखने से पहले [परिभाषात्मक सी ++ पुस्तक गाइड और सूची] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) पर एक नज़र डालें कोई अन्य लाइन – sbi