क्या वृद्धि करना / घटाना या एक पूर्णांक में एक पूर्णांक मान को इंगित करने के लिए एक पूर्णांक मान को जोड़ना है जो कि पूर्वनिर्धारित व्यवहार में किसी तत्व को इंगित नहीं कर रहा है?
मुझे पता है कि तत्वों के अनुक्रम को चलाने के लिए पॉइंटर्स (एरे एलीमेंट) और पुनरावृत्तियों को बढ़ाया / घटाया जा सकता है और सीक्वेंस में तत्वों के लिए बैक-एंड-जंप कर सकते हैं।
लेकिन क्या होगा यदि मैं एक एकल वस्तु के लिए एक संकेतक बढ़ाता हूं या इसे पूर्णांक मान जोड़ता हूं? क्या यह अपरिभाषित व्यवहार है या यह ठीक है लेकिन हम उस मेमोरी तक नहीं पहुँच सकते हैं?
int x = 551;
int* p = &x;
++p;
--p;
std::cout << *p << '\n';
क्योंकि मैंने पहले ही पढ़ा है कि हमें एक ऐसे पॉइंटर को नहीं बढ़ाना / घटाना चाहिए जो किसी तत्व को उदाहरण के लिए अनुक्रम या एरे में इंगित न करे।
तो क्या कोई समझा सकता है कि क्या होगा और क्या मेरा उदाहरण ठीक है (डी-रेफरेंसिंग पॉइंटर पी)? धन्यवाद!
जवाब
जब पॉइंटर अंकगणित पॉइंटर पर लागू होता है जो ऑब्जेक्ट को इंगित करता है, तो पॉइंटर को केवल एक तत्व के साथ उस ऑब्जेक्ट प्रकार की एक सरणी को इंगित करने के लिए माना जाता है, जैसा कि मानक में कहा गया है ।
एक ऑब्जेक्ट जो एक सरणी तत्व नहीं है, इस उद्देश्य के लिए एकल-तत्व सरणी से संबंधित माना जाता है
उदाहरण के लिए, पॉइंटर p
जैसे कि यह इंगित करता है int arr[1] = {551}
कि, इसी ऑपरेशन को इंगित करने वाले पॉइंटर पर लागू करने के समान है arr
। इसका मतलब है, ++p
कर देगा p
तत्व आगमन [1] (काल्पनिक) को इंगित करें, और --p
कर देगा p
फिर से पहला तत्व आगमन [0] को इंगित करें। तो, आखिरी में, डी-रेफ़रिंग पॉइंटर p
ठीक है और किसी भी यूबी में परिणाम नहीं करता है।