【问题标题】:Incrementing Pointers递增指针
【发布时间】:2021-12-11 16:38:37
【问题描述】:

我有一个关于指针递增的问题,我不太明白。

我们来看2个小程序:

int iTuna=1;
int* pPointer= &iTuna;
*pPointer = *pPointer + 1 ; //Increment what pPointer is pointing to.
cout << iTuna << endl;

在第一个程序中,我递增 pPointer 指向的内容,如“*pPointer = *pPointer +1”。 正如我所料,iTuna 更改为“2”,程序打印出值“2”

int iTuna=1;
int* pPointer= &iTuna;
*pPointer++; //Increment what pPointer is pointing to.
cout << iTuna << endl;
system("PAUSE");
return 0;

在这里,我增加了 pPointer 指向的“*pPointer++”。但是这里 iTuna 保持为 "1" 并且程序打印出值 "1" 。 虽然我预计这个会作为第一个工作,但它没有。

请帮助我并告诉我为什么第二段代码没有像我预期的那样工作以及如何解决它。

谢谢

【问题讨论】:

  • 小心你使用的两个运算符的operator precedence
  • 在第二个中,增加指针地址。所以如果你做 cout
  • 您必须先取消引用,然后再增加指向的内容 - ++*pPointer
  • 而且,顺便说一句,在名为 Pointer 的东西上使用 p 前缀是相当愚蠢的。如果不是指针,Pointer 会是什么?

标签: c++ pointers increment


【解决方案1】:
*pPointer++;

等价于

*pPointer;
pPointer++; 

所以它增加了指针,而不是取消引用的值。

您可能会不时在字符串复制实现中看到这一点,例如

  while(*source)
    *target++ = *source++;

由于您的问题是运算符优先级的问题,如果您想取消引用指针,然后递增,您可以使用括号:

(*pointer)++;

【讨论】:

  • 你能解释一下为什么吗?并告诉我如何使用 ++ 运算符来增加 pPointer 指向的内容
  • 这将增加指针指向的内容:(*pPointer)++;
  • (*pPointer)++*pPointer += 1
  • @MohamedAhmedNabil :pPointer 是一个内存案例,它包含一个包含整数的内存案例的地址。如果要增加整数,首先要获取该整数的地址,该地址存储在内存盒(pPointer)中。所以要增加整数,你必须增加存储在 pPointer 中的地址的内容: (*pPointer)++ 而不是它自己的地址 (pPointer++)。 *pPointer++ 递增 pPointer,因为 ++ 的优先级高于 * 运算符。
  • 非常感谢您的帮助,这是迄今为止最好的答案。但是,我还需要问你一件事。取消引用是什么意思
【解决方案2】:
 *ptr++; - increment pointer and dereference old pointer value

相当于:

*(ptr_p++) - increment pointer and dereference old pointer value

这是增加值的方法

(*ptr)++; - increment value

这是因为++ 的优先级高于*,但您可以使用() 控制优先级

【讨论】:

    【解决方案3】:

    ++ 运算符优先级高于 *d 取消引用。

    你写的其实是

    *(p++)
    

    但是你应该使用

    (*p)++
    

    【讨论】:

      【解决方案4】:

      在第二个程序中,您不是在增加 pPointer 地址的内容,而是在增加指针。所以在这里假设如果 pPointer 值(分配给 iTuna 的内存位置)是 1000,那么它会将位置增加到 1000+2(int size)=1002,而不是将内容增加到 1+1=2。在上面的程序中,您正在访问指针位置内容。这就是为什么你没有得到预期的结果

      【讨论】:

      • 在 c++ 中它是 2 字节 = 16 位。
      【解决方案5】:

      *pPointer++; - 这里取消引用运算符(*)比递增运算符(++)具有更高的优先级。所以这个语句首先取消引用并增加指针。在此之后,您将打印 iTuna 的值,这将为您提供相同的值。您不是通过取消引用指针变量(*pPointer)来打印值,因为这会导致崩溃(未定义的行为)。因为pPointer 现在增加了。

      使用(*pPointer)++; 来增加pPointer 指向的值。

      为了清楚地知道在您的增量语句之前和之后打印存储在pPointer 变量中的地址。

      【讨论】:

        【解决方案6】:

        第一种情况,指针的内容是递增的,因为*pPointer对应变量iTuna的内容。

        在第二个中,内容没有增加,因为你 pPointer 增加了指针地址。记住运算符优先级规则,后缀运算符(如递增 (++) 和递减 (--))比前缀运算符(如解引用运算符 (*))具有更高的优先级。因此,写

        *pPointer++

        等价于

        *(pPointer++)

        而它的作用是增加 pPoiner 的值(所以它现在指向下一个元素),但是因为 ++ 用作后缀,所以整个表达式被评估为指针最初指向的值(地址它在递增之前指向)。

        拥有您所期望的正确代码如下:

        ++*pPointer

        (*pPointer)++

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-23
          • 2017-01-05
          • 1970-01-01
          • 2016-07-01
          • 2013-07-15
          相关资源
          最近更新 更多