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


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.