13

我有一个关于增加我不太理解的指针的问题。

让我们看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" 。虽然我希望这个能作为第一个工作,但事实并非如此。

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

谢谢你

4

6 回答 6

25
*pPointer++;

相当于

*pPointer;
pPointer++; 

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

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

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

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

(*pointer)++;
于 2012-08-01T07:28:15.393 回答
6

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

你写的其实是

*(p++)

但是你应该使用

(*p)++
于 2012-08-01T07:29:56.413 回答
3
 *ptr++; - increment pointer and dereference old pointer value

它相当于:

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

这是增加值的方法

(*ptr)++; - increment value

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

于 2012-08-01T07:29:48.937 回答
1

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

于 2012-08-01T07:35:11.767 回答
0

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

使用 like(*pPointer)++;来增加 . 所指向的值pPointer

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

于 2012-08-01T15:30:47.587 回答
0

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

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

*pPointer++

相当于

*(pPointer++)

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

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

++*pPointer

或者

(*pPointer)++

于 2019-08-12T05:51:19.157 回答