是否允许向空指针添加零?
Is it allowed to add a zero to a null pointer?
我知道空指针不允许指针运算。但是想象一下我有这样的东西:
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
?
我特别感谢标准参考文献。
是的,您可以将空指针加零并从另一个空指针中减去一个。引用 C++ 标准的加法运算符 [expr.add] 部分:
When an expression J
that has integral type is added to or subtracted from an expression P
of pointer type, the result has the type of P
.
- If
P
evaluates to a null pointer value and J
evaluates to 0, the result is a null pointer value.
我知道空指针不允许指针运算。但是想象一下我有这样的东西:
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
?
我特别感谢标准参考文献。
是的,您可以将空指针加零并从另一个空指针中减去一个。引用 C++ 标准的加法运算符 [expr.add] 部分:
When an expression
J
that has integral type is added to or subtracted from an expressionP
of pointer type, the result has the type ofP
.
- If
P
evaluates to a null pointer value andJ
evaluates to 0, the result is a null pointer value.