2008-10-24 14 views
5

सी और सी ++ में निम्नलिखित घोषणाएं क्या करती हैं?सी में इन घोषणाओं के बीच क्या अंतर है?

const int * i; 
int * const i; 
const volatile int ip; 
const int *i; 

क्या उपर्युक्त घोषणाओं में से कोई भी गलत है?

यदि उनके बीच अर्थ और अंतर क्या नहीं है?

उपर्युक्त घोषणाओं के उपयोगी उपयोग क्या हैं (मेरा मतलब है कि हमें सी/सी ++/एम्बेडेड सी में उन्हें किस स्थिति में उपयोग करना है)?

+0

यदि आप व्याकरण और वर्तनी के लिए संपादित करने जा रहे हैं, तो क्यों नहीं 'अगर' 'I' के साथ टाइप करें और नहीं '!'? – Eclipse

उत्तर

34

const int * i;

i निरंतर पूर्णांक के लिए सूचक है। i को एक अलग मान पर इंगित करने के लिए बदला जा सकता है, लेकिन i द्वारा इंगित मूल्य को बदला नहीं जा सकता है।

int * const i;

i एक गैर निरंतर पूर्णांक तक एक निरंतर सूचक है। i द्वारा इंगित मूल्य बदला जा सकता है, लेकिन i को किसी भिन्न मान पर इंगित करने के लिए बदला नहीं जा सकता है।

const volatile int ip;

यह एक तरह का मुश्किल है। तथ्य यह है कि ipconst का अर्थ है कि संकलक आपको ip का मान बदलने नहीं देगा। हालांकि, यह अभी भी सिद्धांत में संशोधित किया जा सकता है, उदा। अपना पता ले कर और const_cast ऑपरेटर का उपयोग करके। यह बहुत खतरनाक है और अच्छा विचार नहीं है, लेकिन इसकी अनुमति है। volatile क्वालीफायर इंगित करता है कि किसी भी समय ip एक्सेस किया गया है, इसे हमेशा स्मृति से पुनः लोड किया जाना चाहिए, यानी इसे किसी रजिस्टर में कैश नहीं किया जाना चाहिए। यह संकलक को कुछ अनुकूलन करने से रोकता है। आप volatile क्वालीफायर का उपयोग करना चाहते हैं जब आपके पास एक वेरिएबल हो जो किसी अन्य थ्रेड द्वारा संशोधित किया जा सकता है, या यदि आप मेमोरी मैप किए गए I/O, या अन्य समान स्थितियों का उपयोग कर रहे हैं जो संकलक की अपेक्षा नहीं कर सकते हैं। उसी चर पर const और volatile का उपयोग करना असामान्य है (लेकिन कानूनी) - आप आमतौर पर एक देखेंगे लेकिन दूसरे नहीं।

const int *i;

यह पहली घोषणा के समान है।

+0

क्या आप सुनिश्चित हैं कि अस्थिरता केवल पढ़ने-योग्य मान को अन्य थ्रेड में किए गए परिवर्तनों को प्रतिबिंबित करने की गारंटी है? क्या कार्यान्वयन पर? गैर-सुसंगत कैश वाले बहु-कोर आर्किटेक्चर के बारे में क्या? –

+1

यदि कोई वैरिएबल ** घोषित ** 'const' (जैसा कि 'ip' यहां है) है, तो मान को संशोधित करने के लिए' const'cast' के साथ' const' को हटाने के लिए यह अनिर्धारित व्यवहार है। इसके अलावा, अस्थिरता को अन्य थ्रेड में परिवर्तन करने की गारंटी नहीं है। विशेष कंपाइलर यह गारंटी दे सकते हैं। –

+0

एंथनी पूरी तरह से सही है। अस्थिर आपके परिवर्तनीय थ्रेड-जागरूक नहीं बनाता है। एक चर घोषित घोड़े से दूर कास्ट कास्टिंग, अपरिभाषित behaivor है। –

4

आप बोलने के लिए सी/सी ++ दाएं से बाएं में चर घोषणाएं पढ़ते हैं।

const int *i; // pointer to a constant int (the integer value doesn't change) 

int *const i; // constant pointer to an int (what i points to doesn't change) 

const volatile int ip; // a constant integer whose value will never be cached by the system 

उनमें से प्रत्येक का अपना उद्देश्य है। किसी भी सी ++ पाठ्यपुस्तक या आधे सभ्य संसाधन में प्रत्येक के स्पष्टीकरण होंगे।

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