सी में कॉन्स और अस्थिर सूचक के बीच अंतर क्या हैं?सी में कॉन्स और अस्थिर सूचक के बीच अंतर क्या हैं?
उत्तर
अंतर वास्तव में 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
महान जवाब! +1 –
'अस्थिर' के लिए एक और वैध उपयोग तब होता है जब डेटा तक पहुंचने का कार्य महत्वपूर्ण होता है, जो स्मृति-मैप किए गए I/O में उचित रूप से संभव है। मानक के 1.9 (6) में, "अवलोकन योग्य व्यवहार" को "अस्थिर 'डेटा को पढ़ने और लिखने का अनुक्रम और लाइब्रेरी I/O फ़ंक्शंस को कॉल करने के रूप में परिभाषित किया जाता है।" –
यहाँ उन दो अवधारणाओं
स्थिरांक कीवर्ड निर्दिष्ट करता है कि सूचक आरंभीकरण के बाद बदला नहीं जा सकता की व्याख्या दी गई; सूचक उसके बाद संशोधन से संरक्षित है।
अस्थिर कीवर्ड निर्दिष्ट करता है कि निम्न नाम से जुड़े मूल्य को उपयोगकर्ता एप्लिकेशन के अलावा अन्य कार्रवाइयों द्वारा संशोधित किया जा सकता है। इसलिए, अस्थिर कीवर्ड साझा स्मृति में ऑब्जेक्ट्स को घोषित करने के लिए उपयोगी है जिसे कई प्रक्रियाओं या इंटरप्ट सेवा दिनचर्या के साथ संचार के लिए उपयोग किए जाने वाले वैश्विक डेटा क्षेत्रों द्वारा एक्सेस किया जा सकता है।
यह डेटा कि नहीं संशोधित किया जा सकता करने के लिए से here
एक स्थिरांक सूचक (अर्थात const char* s = ..
) अंक आता है। एक अस्थिर सूचक (यानी volatile char* s = ...
) संकलक को इंगित करता है कि पॉइंटर को सीपीयू रजिस्टरों या अन्यत्र संदर्भित करने वाले डेटा को कैश नहीं किया जाता है। इसके बजाए, जब भी उनकी आवश्यकता होती है, वे अपने मूल स्मृति स्थान से फिर से पढ़े जाते हैं। यह आवश्यक है यदि डेटा की सामग्री कंपाइलर के दायरे के बाहर बदल सकती है, उदाहरण के लिए इसे संशोधित करने वाले दूसरे थ्रेड के माध्यम से।
सावधान रहें, const char*
और char* const
volatile
क्वालीफायर के लिए अलग-अलग चीजें हैं। यदि आप अनिश्चित हैं, तो उन्हें देखो।
आम तौर पर, const
या volatile
पॉइंटर पर लागू होता है, न कि पॉइंटर स्वयं।
const
का मतलब है कि आपको उस पॉइंटर के माध्यम से पॉइंट को संशोधित करने की अनुमति नहीं है।
volatile
का मतलब है कि कोई व्यक्ति/कुछ और पॉइन्टे को संशोधित कर सकता है, भले ही आपका कोड न हो। इसका अर्थ यह भी है कि परिवर्तनीय को लिखने से वैरिएबल का उपयोग करने के लिए अगली बार पुनर्प्राप्त करने के लिए केवल एक मूल्य को स्टोर करने से कुछ और किया जा सकता है। नतीजतन, जब भी आपका कोड अस्थिर मूल्य को पढ़ता या लिखता है, तो संकलक को वास्तविक स्मृति से पढ़ने वाले कोड उत्पन्न करने के लिए बाध्य किया जाता है, न केवल (उदाहरण के लिए) अस्थायी उपयोग के लिए एक रजिस्टर आवंटित करता है, और पढ़ता/लिखता है रजिस्टर।
संपादित करें: ध्यान दें कि भले ही आपको const
पॉइंटर के माध्यम से डेटा को संशोधित करने की अनुमति नहीं है, फिर भी डेटा अन्य माध्यमों द्वारा संशोधित किया जा सकता है। वास्तव में, ऐसे समय होते हैं जब आप एक पॉइंटी हो सकते हैं जो const
औरvolatile
है, जिसका अर्थ है कि आप इसे बदल नहीं सकते हैं, लेकिन कोई और हो सकता है।
यह निर्भर करता है कि यह 'const char * p' या' char * const p' है। आप काफी हद तक 'const char * const p' कर सकते हैं। –
- 1. कॉन्स के बीच अंतर। सूचक और संदर्भ?
- 2. अस्थिर और स्थिरांक सूचक
- 3. सी # में कॉन्स और स्टेटिक के बीच क्या अंतर है?
- 4. शून्य सूचक और शून्य सूचक के बीच क्या अंतर है?
- 5. अस्थिर और बाहरी के बीच क्या अंतर है?
- 6. चरित्र सरणी और सूचक के बीच अंतर
- 7. स्थिर स्थिरांक और कॉन्स के बीच क्या अंतर है?
- 8. प्रतिनिधि उदाहरण और विधि सूचक के बीच क्या अंतर है?
- 9. सी, और सी ++ कॉलिंग सम्मेलनों के बीच अंतर क्या हैं?
- 10. कॉन्स void * ctypes में सूचक
- 11. सी ++ में पॉइंटर के बीच अंतर और सी #
- 12. एक शून्य सूचक और एक पूर्ण सूचक के बीच क्या अंतर है?
- 13. एफ (कॉन्स स्ट्रिंग और) और एफ (कॉन्स स्ट्रिंग) के बीच कोई अंतर?
- 14. $ {} और # {} के बीच अंतर क्या हैं?
- 15. कॉन्स चार सूचक असाइनमेंट
- 16. पैरामीटर परिभाषाओं के बीच अंतर (प्रकार और नाम), और (प्रकार * नाम) के बीच अंतर क्या हैं?
- 17. सी ++ और कॉन्स - एक कॉन्स संदर्भ
- 18. -> और के बीच अंतर के लिए तर्क क्या है। सी/सी ++ में? (।):
- 19. अंतर पढ़ता है और अस्थिर
- 20. लटकने वाले सूचक और मेमोरी रिसाव के बीच अंतर
- 21. सी # में ToUpper() और ToUpperInvariant() के बीच क्या अंतर है?
- 22. सी में क्वालीफायर और संशोधक के बीच क्या अंतर है?
- 23. सी # में वस्तुओं और कक्षाओं के बीच क्या अंतर है?
- 24. सी # में सीएलआर और डीएलआर के बीच क्या अंतर है?
- 25. सी # में फ़ाइल और फ़ाइलइन्फो के बीच क्या अंतर है?
- 26. विंडोज और लिनक्स में पाइप के बीच अंतर क्या हैं?
- 27. MySQL में INSERT और UPDATE के बीच अंतर क्या हैं?
- 28. निषेध में हैसोन और संदर्भों के बीच अंतर क्या हैं?
- 29. Win32 में RedrawWindow और UpdateWindow के बीच अंतर क्या हैं?
- 30. PHP में ADOdb और PDO के बीच अंतर क्या हैं?
वे पूरी तरह से अलग हैं। क्या आपने दस्तावेज पर भी देखा है? –
@Anon: लेकिन उनके विपरीत संदर्भ है। प्रश्न एक नौसिखिया के लिए वैध है। संतुलन के लिए +1। –
@the_drow: वे विपरीत दिखते हैं, लेकिन 'कॉन्स्ट अस्थिर' एक पूरी तरह से वैध सीवी-क्वालीफायर है, जिसका अर्थ है "कार्यक्रम इसे बदल नहीं रहा है, लेकिन कुछ और हो सकता है, या पहुंच करने से कुछ भी हो सकता है"। –