क्या शून्य शून्य सूचक को जोड़ने की अनुमति है?


9

मुझे पता है कि सूचक अंकगणित अशक्त बिंदुओं के लिए अस्वीकृत है। लेकिन कल्पना कीजिए कि मेरे पास ऐसा कुछ है:

class MyArray {
  int *arrayBegin;  // pointer to the first array item, NULL for an empty array
  unsigned arraySize;   // size of the array, zero for an empty array
public:
  int *begin() const { return arrayBegin; }
  int *end() const { return arrayBegin + arraySize; }  // possible? (arrayBegin may be null)

क्या उपरोक्त end()कार्यान्वयन संभव है (अनुमति) ? या क्या यह आवश्यक है:

  int *end() const { return (arraySize == 0) ? nullptr : (arrayBegin + arraySize); }

nullptr के साथ सूचक अंकगणित से बचने के लिए क्योंकि arrayBeginरिक्त सरणी के लिए अशक्त है ( arraySizeइस मामले में शून्य होने के बावजूद )?

मुझे पता है कि इसके int *end;बजाय स्टोर करना संभव है unsigned size;और आकार की गणना की जानी चाहिए end-begin- लेकिन फिर एक ही मुद्दा आता है: क्या इसे गणना करने की अनुमति है nullptr - nullptr?

मैं विशेष रूप से मानक संदर्भों की सराहना करूंगा।

जवाबों:


8

हां, आप शून्य सूचक में शून्य जोड़ सकते हैं और एक नल सूचक को दूसरे से घटा सकते हैं। Additive ऑपरेटरों को उद्धृत करते हुए [expr.add] C ++ मानक का अनुभाग:

जब एक Jप्रकार का अभिन्न अंग अभिन्न प्रकार को Pसूचक प्रकार की अभिव्यक्ति से जोड़ा या घटाया जाता है , तो परिणाम का प्रकार होता है P

  • यदि Pएक अशक्त सूचक मान का Jमूल्यांकन करता है और 0 का मूल्यांकन करता है, तो परिणाम शून्य सूचक मान है।

8
"8.7 7" क्या है? यदि आप C ++ मानक का उल्लेख करते हैं, तो कृपया निर्दिष्ट करें कि कौन सा है। आमतौर पर, ब्रैकेट्स में अनुभाग "नाम" का उपयोग करना बेहतर होता है, क्योंकि खंड / अध्याय / पैराग्राफ नंबरिंग आमतौर पर प्रत्येक मानक संस्करण के साथ बदलता है। वर्तमान मसौदे में, संबंधित खंड [expr.add] पैराग्राफ 4.1 और 5.1 है
डैनियल लैंगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.