क्या वृद्धि करना / घटाना या एक पूर्णांक में एक पूर्णांक मान को इंगित करने के लिए एक पूर्णांक मान को जोड़ना है जो कि पूर्वनिर्धारित व्यवहार में किसी तत्व को इंगित नहीं कर रहा है?

Dec 07 2020

मुझे पता है कि तत्वों के अनुक्रम को चलाने के लिए पॉइंटर्स (एरे एलीमेंट) और पुनरावृत्तियों को बढ़ाया / घटाया जा सकता है और सीक्वेंस में तत्वों के लिए बैक-एंड-जंप कर सकते हैं।

लेकिन क्या होगा यदि मैं एक एकल वस्तु के लिए एक संकेतक बढ़ाता हूं या इसे पूर्णांक मान जोड़ता हूं? क्या यह अपरिभाषित व्यवहार है या यह ठीक है लेकिन हम उस मेमोरी तक नहीं पहुँच सकते हैं?

int x = 551;
int* p = &x;
++p;
--p;
std::cout << *p << '\n';

क्योंकि मैंने पहले ही पढ़ा है कि हमें एक ऐसे पॉइंटर को नहीं बढ़ाना / घटाना चाहिए जो किसी तत्व को उदाहरण के लिए अनुक्रम या एरे में इंगित न करे।

तो क्या कोई समझा सकता है कि क्या होगा और क्या मेरा उदाहरण ठीक है (डी-रेफरेंसिंग पॉइंटर पी)? धन्यवाद!

जवाब

2 告白气球 Dec 23 2020 at 16:33

जब पॉइंटर अंकगणित पॉइंटर पर लागू होता है जो ऑब्जेक्ट को इंगित करता है, तो पॉइंटर को केवल एक तत्व के साथ उस ऑब्जेक्ट प्रकार की एक सरणी को इंगित करने के लिए माना जाता है, जैसा कि मानक में कहा गया है ।

एक ऑब्जेक्ट जो एक सरणी तत्व नहीं है, इस उद्देश्य के लिए एकल-तत्व सरणी से संबंधित माना जाता है

उदाहरण के लिए, पॉइंटर pजैसे कि यह इंगित करता है int arr[1] = {551}कि, इसी ऑपरेशन को इंगित करने वाले पॉइंटर पर लागू करने के समान है arr। इसका मतलब है, ++pकर देगा pतत्व आगमन [1] (काल्पनिक) को इंगित करें, और --pकर देगा pफिर से पहला तत्व आगमन [0] को इंगित करें। तो, आखिरी में, डी-रेफ़रिंग पॉइंटर pठीक है और किसी भी यूबी में परिणाम नहीं करता है।