从整数中减去指针

时间:2017-01-26 14:36:47

标签: c++ pointers subtraction pointer-arithmetic

    int *p = new int; 
    int a = 10; 
    cout << a+p;
    cout << a-p;

打印a + p,p + a,p-a给出一个地址,但a-p给出了一个错误。为什么会这样?指针地址不是整数吗?如果是这样,a-p不应该给我一个负值吗?

1 个答案:

答案 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: [] }; 也是如此,因此它们被视为语法错误。