“*ptrInt ++”是什么意思?

8
我正在实现一个模板指针包装器,类似于 boost::shared_ptr
我有一个指向整数的指针ptrInt
我的意图是:增加ptrInt所指向的整数。
我的初始代码是这样的:*ptrInt ++;,虽然我也尝试了使用(*ptrInt) ++;
然而,显然,这似乎并没有做到我期望的效果。最终,我使用*ptrInt += 1;让它正常工作,但我自问:
  • *ptrInt ++;到底是做什么的?
  • 是否有更优雅的解决方案来使用*ptrInt += 1;

我正在实现一个模板指针包装器。停止操作。即使最好的C++程序员也会犯这个错误。使用提供的工具,不要重复造轮子(稍后会有机会这么做)。 - Martin York
8个回答

9
*p++    // Return value of object that p points to and then increment the pointer
(*p)++  // As above, but increment the object afterwards, not the pointer
*p += 1 // Add one to the object p points to

最后两个都会增加对象,所以我不确定为什么您认为它不起作用。如果表达式用作值,则最终形式将在增加后返回值,而其他形式则在增加之前返回值。
x = (*p)++; // original value in x

(*p)++;
x = *p;     // new value in X

或者

x = ++*p;   // increment object and store new value in x

2
@Caleb:第一行代码的工作方式基本上就像@DigitalRoss所描述的那样。指针被递增,操作的结果是旧值,然后对其进行解引用。 - R. Martinho Fernandes
@Martinho, 该死,我没先试一下就直接发了。感谢您纠正我。 - Caleb

4

*ptr++ equivalent to *(ptr++)


3

*ptrInt ++

  1. 将ptrInt加1

  2. 解除引用ptrInt的旧值

(*ptrInt) ++以及*ptrInt += 1也能达到你想要的效果。

参见运算符优先级


1

(*ptr)++ 应该可以实现,除非你立即使用它的值。那么使用 ++*ptr,由于从右到左的结合性,它等同于 ++(*ptr)。

顺便提一下,这里是我的智能指针实现,也许可以帮助你编写自己的代码。


0

表达式的计算遵循运算符优先级规则。

++ 的后缀版本(即在变量之后使用 ++)比 * 运算符(间接寻址)具有更高的优先级。

这就是为什么 *ptr++ 等同于 *(ptr++)


0
你想要的是 (*ptrInt)++,它会增加对象的值,通常与 *ptrInt += 1 的效果相同。也许你已经重载了 += 运算符,但没有重载 ++ 运算符(后缀和前缀递增运算符)?

0

更加优雅的方式是你之前尝试过的。即 (*ptrInt) ++;

既然你对此不满意,可能是因为后置递增。

比如,std::cout<<(*ptrInt) ++; 会显示未递增的值。

所以,尝试使用 ++(*ptrInt); ,这也许会符合你的期望。


-1
在您的情况下,*ptrInt++ 仅会增加指针,没有其他效果(在此之前,它会获取该位置处的值并将其丢弃。当然,如果您在更复杂的表达式中使用它,则会使用它)。 (*ptrInt)++ 才是您要找的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接