2010-01-18 10 views
9

सी में कॉन्स और अस्थिर सूचक के बीच अंतर क्या हैं?सी में कॉन्स और अस्थिर सूचक के बीच अंतर क्या हैं?

+4

वे पूरी तरह से अलग हैं। क्या आपने दस्तावेज पर भी देखा है? –

+0

@Anon: लेकिन उनके विपरीत संदर्भ है। प्रश्न एक नौसिखिया के लिए वैध है। संतुलन के लिए +1। –

+1

@the_drow: वे विपरीत दिखते हैं, लेकिन 'कॉन्स्ट अस्थिर' एक पूरी तरह से वैध सीवी-क्वालीफायर है, जिसका अर्थ है "कार्यक्रम इसे बदल नहीं रहा है, लेकिन कुछ और हो सकता है, या पहुंच करने से कुछ भी हो सकता है"। –

उत्तर

16

अंतर वास्तव में const और volatile के बीच के अंतर के लिए आता है। इन दोनों अवधारणाओं में एकमात्र चीजें समान हैं सिंटैक्स है। const संकलक-लागू है और कहता है "प्रोग्रामर इसे बदल नहीं सकता है।" volatile कहता है "यह डेटा किसी और द्वारा बदला जा सकता है" और इसलिए संकलक उस डेटा के बारे में कोई धारणा नहीं बनाएगा। volatile के बिना संकलक कह सकता है "मैंने इस डेटा को स्मृति से एक रजिस्टर में रखा है, और चूंकि मैंने उस डेटा में कुछ भी नहीं किया है, मुझे यकीन है कि यह वही है और मुझे इसे फिर से रजिस्टर में पढ़ने की आवश्यकता नहीं है। " जब डेटा को volatile के रूप में चिह्नित किया जाता है तो संकलक ऐसी धारणा नहीं करेगा (क्योंकि किसी और ने डेटा बदल दिया हो सकता है) और इसलिए यह डेटा को रजिस्टर में फिर से पढ़ेगा।

अब, आप

const int* p; 

और

volatile int* q; 
के बीच

int *const p; 

और

int *volatile q; 

या अंतर के बीच अंतर के लिए पूछ रहे हैं 0

पूर्व के मामले में: p एक int और जहां कि सूचक अंक जबकि q प्रोग्रामर द्वारा बदला नहीं जा सकता करने के लिए एक सूचक है एक int और जहां कि सूचक अंक प्रोग्रामर के अलावा अन्य किसी के द्वारा बदला जा सकता है के लिए सूचक है तो संकलक उस सूचक के बारे में कोई धारणा नहीं करता है।

तो:

int *const p = (int*)malloc(sizeof(int)); 
int *volatile q = (int*)malloc(sizeof(int)); 
*p = 17; // legal; 
p = (int*)malloc(sizoef(int)); // not legal 
*q = 17; // legal; 
q = (int*)malloc(sizeof(int)); // legal 

उत्तरार्द्ध मामले में: p एक int के लिए सूचक है और क्या p जबकि q प्रोग्रामर द्वारा बदला नहीं जा सकता की ओर इशारा करते है एक int के लिए सूचक है और क्या q है इंगित करने के लिए प्रोग्रामर के अलावा किसी अन्य व्यक्ति द्वारा बदला जा सकता है ताकि संकलक उस डेटा के बारे में कोई धारणा न करे।

int i = 17; 
int j = 34; 
const int *p = &i; 
volatile int *q = &i; 
*p = 51; // not legal 
p = &j; // legal 
*q = 51; // legal 
q = &j; // legal 
+0

महान जवाब! +1 –

+0

'अस्थिर' के लिए एक और वैध उपयोग तब होता है जब डेटा तक पहुंचने का कार्य महत्वपूर्ण होता है, जो स्मृति-मैप किए गए I/O में उचित रूप से संभव है। मानक के 1.9 (6) में, "अवलोकन योग्य व्यवहार" को "अस्थिर 'डेटा को पढ़ने और लिखने का अनुक्रम और लाइब्रेरी I/O फ़ंक्शंस को कॉल करने के रूप में परिभाषित किया जाता है।" –

1

यहाँ उन दो अवधारणाओं

स्थिरांक कीवर्ड निर्दिष्ट करता है कि सूचक आरंभीकरण के बाद बदला नहीं जा सकता की व्याख्या दी गई; सूचक उसके बाद संशोधन से संरक्षित है।

अस्थिर कीवर्ड निर्दिष्ट करता है कि निम्न नाम से जुड़े मूल्य को उपयोगकर्ता एप्लिकेशन के अलावा अन्य कार्रवाइयों द्वारा संशोधित किया जा सकता है। इसलिए, अस्थिर कीवर्ड साझा स्मृति में ऑब्जेक्ट्स को घोषित करने के लिए उपयोगी है जिसे कई प्रक्रियाओं या इंटरप्ट सेवा दिनचर्या के साथ संचार के लिए उपयोग किए जाने वाले वैश्विक डेटा क्षेत्रों द्वारा एक्सेस किया जा सकता है।

यह डेटा कि नहीं संशोधित किया जा सकता करने के लिए से here

1

एक स्थिरांक सूचक (अर्थात const char* s = ..) अंक आता है। एक अस्थिर सूचक (यानी volatile char* s = ...) संकलक को इंगित करता है कि पॉइंटर को सीपीयू रजिस्टरों या अन्यत्र संदर्भित करने वाले डेटा को कैश नहीं किया जाता है। इसके बजाए, जब भी उनकी आवश्यकता होती है, वे अपने मूल स्मृति स्थान से फिर से पढ़े जाते हैं। यह आवश्यक है यदि डेटा की सामग्री कंपाइलर के दायरे के बाहर बदल सकती है, उदाहरण के लिए इसे संशोधित करने वाले दूसरे थ्रेड के माध्यम से।

सावधान रहें, const char* और char* constvolatile क्वालीफायर के लिए अलग-अलग चीजें हैं। यदि आप अनिश्चित हैं, तो उन्हें देखो।

2

आम तौर पर, const या volatile पॉइंटर पर लागू होता है, न कि पॉइंटर स्वयं।

const का मतलब है कि आपको उस पॉइंटर के माध्यम से पॉइंट को संशोधित करने की अनुमति नहीं है।

volatile का मतलब है कि कोई व्यक्ति/कुछ और पॉइन्टे को संशोधित कर सकता है, भले ही आपका कोड न हो। इसका अर्थ यह भी है कि परिवर्तनीय को लिखने से वैरिएबल का उपयोग करने के लिए अगली बार पुनर्प्राप्त करने के लिए केवल एक मूल्य को स्टोर करने से कुछ और किया जा सकता है। नतीजतन, जब भी आपका कोड अस्थिर मूल्य को पढ़ता या लिखता है, तो संकलक को वास्तविक स्मृति से पढ़ने वाले कोड उत्पन्न करने के लिए बाध्य किया जाता है, न केवल (उदाहरण के लिए) अस्थायी उपयोग के लिए एक रजिस्टर आवंटित करता है, और पढ़ता/लिखता है रजिस्टर।

संपादित करें: ध्यान दें कि भले ही आपको const पॉइंटर के माध्यम से डेटा को संशोधित करने की अनुमति नहीं है, फिर भी डेटा अन्य माध्यमों द्वारा संशोधित किया जा सकता है। वास्तव में, ऐसे समय होते हैं जब आप एक पॉइंटी हो सकते हैं जो constऔरvolatile है, जिसका अर्थ है कि आप इसे बदल नहीं सकते हैं, लेकिन कोई और हो सकता है।

+0

यह निर्भर करता है कि यह 'const char * p' या' char * const p' है। आप काफी हद तक 'const char * const p' कर सकते हैं। –

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