int *p = new int;
int a = 10;
cout << a+p;
cout << a-p;
打印a + p,p + a,p-a给出一个地址,但a-p给出了一个错误。为什么会这样?指针地址不是整数吗?如果是这样,a-p不应该给我一个负值吗?
答案 0 :(得分:2)
就指针算法而言,指针不等于&#34;整数代表某个地址&#34;。即使添加也不是那么简单:
int64_t *p
并不代表&#34;从p变量获取地址值并将其增加一个&#34;。实际地址增量金额取决于指向变量的大小,因此递增int8_t *p
会使递增p
为什么我们有这样的&#34;奇怪的行为&#34;用于指针的加法和减法?简单的回答:因为它在C ++标准中以这种方式定义:
5.7添加运算符
另外,两个操作数都应具有算术或非范围枚举类型,或者一个操作数应为a 指向完全定义的对象类型的指针,另一个应具有 积分或无范围的枚举类型。
对于减法,以下之一应保留:
- 两个操作数都有算术或无范围的枚举类型;或
- 两个操作数都指向同一个完全定义的对象类型的cv-qualified或cv-nonqualified版本;或
- 左操作数是指向完全定义的对象类型的指针,右操作数具有整数或未操作的枚举类型。
但这种限制背后的原因(实际上是在同一标准页面上描述)。指针算法适用于以下用途:如果p+1
指向数组中的某个元素,p-1
指向下一个元素,p1-p2
指向上一个元素,p1+p2
显示数字p1和p2之间的元素。在1-p
这些术语中没有任何意义,const selection = {
timespan: "-3660",
customTimespan: false,
pathIds: [''],
source: undefined,
direction: 0,
appClassIds: []
};
也是如此,因此它们被视为语法错误。