2013-03-29 17 views
6

मैं समझता हूँ किस्थिरांक चार * और चार *

char *s = "Hello World!" ; 

केवल पढ़ने के लिए स्मृति और स्ट्रिंग शाब्दिक सूचक के माध्यम से बदला नहीं जा सकता में संग्रहित है।

यह कैसे से

const char *s = "Hello World!"; 

अलग है इसके अलावा की 'स्ट्रिंग' चार * या स्थिरांक चार * प्रकार है?

+0

पहला रास्ता अब मान्य नहीं है और खतरनाक कर सकते हैं। – Beta

उत्तर

6

const char * के रूप में प्रकार देकर, यह यह कठिन बना देता है गलती से स्मृति अधिलेखित करने के लिए, यदि आप कोशिश के बाद से संकलक एक त्रुटि दे देंगे: समस्या

const char *s = "Hello World!"; 
s[0] = 'X'; // compile error 

आप const का उपयोग नहीं करते हैं, तो रनटाइम तक पकड़ा नहीं जा सकता है, या यह सिर्फ आपके प्रोग्राम को गलत तरीके से गलत कर सकता है।

+0

ओह हाँ मैं देखता हूं कि char * s को संशोधित करने का प्रयास कर रहा है, सफलतापूर्वक संकलित करता है लेकिन char * s को नहीं करता है। इसलिए मूल रूप से स्ट्रिंग को स्ट्रिंग को बदलने के लिए एक लाल झंडा लगाता है। ठंडा ! – dharag

8

अंतर यह है कि उत्तरार्द्ध कानूनी है और पूर्व नहीं है। यह एक बदलाव है जो सी ++ 11 में बनाया गया था। औपचारिक रूप से, "Hello World!" में const char[13] है; इसे const char* में परिवर्तित किया जा सकता है। पुराने दिनों में, इसका प्रकार char[13] हो सकता है, जिसे char* में परिवर्तित किया जा सकता है। C++ ने const जोड़कर सरणी के प्रकार को बदल दिया, लेकिन रूपांतरण को char* पर रखा ताकि 0 सीका उपयोग किया गया मौजूदा सी कोड सी ++ में काम करेगा, लेकिन उस पाठ को संशोधित करेगा जो पॉइंटर ने अपरिभाषित व्यवहार को इंगित करने की ओर इशारा किया था। सी ++ 11 char* करने के लिए रूपांतरण हटा दिया है, इसलिए अब आप केवल कानूनी तौर पर

const char *s = "Hello world!"; 
+0

'सी ++ 11 ने रूपांतरण को हटा दिया *' - gcc48 में नहीं। क्या यह जीसीसी बग है? –

+0

@LeonidVolnitsky - C++ 11 में रूपांतरण की अनुमति नहीं है। नियम यह है कि संकलक को एक बाधा के उल्लंघन के लिए निदान जारी करना चाहिए जो "कोई निदान आवश्यक नहीं" कहता है। तो इसकी जरूरत सिर्फ एक नैदानिक ​​है, जो कभी-कभी चेतावनी होती है। –

+0

यदि 'const' जोड़ना प्रकार बदलता है, तो' 'या 'const ' अधिक तार्किक नहीं होगा? –

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