रूप
volatile int* p;
का एक सूचक एक int
के लिए सूचक है कि संकलक volatile
के रूप में इलाज नहीं है। इसका मतलब यह है कि संकलक मान लेगा कि यह चर के लिए संभव है कि p
स्रोत कोड में कुछ भी नहीं होने के बावजूद यह बदल सकता है कि यह हो सकता है। उदाहरण के लिए, यदि मैं नियमित पूर्णांक को इंगित करने के लिए p
सेट करता हूं, तो हर बार जब मैं *p
पढ़ता या लिखता हूं तो संकलक को पता है कि मान अप्रत्याशित रूप से बदल सकता है।
एक volatile int*
के लिए एक और उपयोग के मामले नहीं है: आप यह घोषणा करते हैं एक int
volatile
के रूप में है, तो आप एक नियमित रूप से int*
साथ इस पर बात नहीं करना चाहिए। उदाहरण के लिए, यह एक बुरा विचार है:
volatile int myVolatileInt;
int* ptr = &myVolatileInt; // Bad idea!
इस का कारण यह सी संकलक नहीं रह गया है याद करते हैं कि उस चर पर ptr
volatile
है द्वारा इशारा किया, तो यह गलत तरीके से एक रजिस्टर में *p
का मूल्य कैश हो सकता है । वास्तव में, सी ++ में, उपर्युक्त कोड एक त्रुटि है। इसके बजाय, आप
volatile int myVolatileInt;
volatile int* ptr = &myVolatileInt; // Much better!
लिखना चाहिए अब, संकलक याद है एक volatile int
पर ptr
अंक, तो यह (या नहीं! चाहिए) नहीं होगा अनुकूलन करने के लिए कोशिश *ptr
के माध्यम से पहुँचता है।
एक आखिरी विस्तार - आपके द्वारा चर्चा की गई पॉइंटर volatile int
पर सूचक है। तुम भी ऐसा कर सकते हैं:
int* volatile ptr;
यह कहा गया है कि सूचक हीvolatile
है, जिसका अर्थ है कि संकलक स्मृति में सूचक कैश करने के लिए प्रयास करें या सूचक मूल्य का अनुकूलन करने की कोशिश नहीं करनी चाहिए क्योंकि सूचक ही कुछ और (हार्डवेयर, एक और धागा, आदि) आप इन एक साथ गठजोड़ कर सकते हैं द्वारा पुन: असाइन हो सकता है अगर आप इस जानवर प्राप्त करना चाहते हैं:
volatile int* volatile ptr;
यह कहा गया है कि दोनों सूचक और pointee अनपेक्षित रूप से बदल हो सकता है । संकलक सूचक को अनुकूलित नहीं कर सकता है, और यह अनुकूलित नहीं कर सकता कि क्या हो रहा है।
आशा है कि इससे मदद मिलती है!
मुझे लगता है कि आपका मतलब है "आपको इसे नियमित int * के साथ इंगित नहीं करना चाहिए" – markgz
@ markgz- Whoops! हाँ, यह सही है। फिक्स्ड। – templatetypedef
मुझे लगता है कि यह सी में भी एक त्रुटि है, लेकिन सी कंपाइलर्स टाइप मिस्चैच के बारे में शिकायत करने के लिए कम प्रवण हैं। –