c++ - 是否允许向空指针添加零?
问题描述
我知道空指针不允许指针算术。但想象一下我有这样的事情:
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]部分:
当
J
具有整数类型的表达式被添加到指针类型的表达式或从P
指针类型的表达式中减去时,结果的类型为P
.
- 如果
P
计算为空指针值并J
计算为 0,则结果为空指针值。
推荐阅读
- cuda - 复数累积乘积的 CUDA 内核
- node.js - 解构 require(d) 模块是否对节点有任何性能优势?
- r - 使用 Reshape 重塑 R 中的数据
- ruby - Programmatically skip a test in RSpec
- c++ - 如何在 EGL 中使用 gtkmm
- java - mybatis 是否允许在 oracle 中插入所有并返回序列(useGenerateKeys)?
- java - Simple-jndi 没有看到我的初始上下文
- javascript - 验证不适用于部分
- 巢穴 - vue.js - Nuxt apollo 智能查询被调用了两次。引擎盖下会发生什么?
- python-3.x - 为什么打印输出在 DataFrame 到 DataFrameGroupBy 之间没有变化?