为什么我不能做*值++;将一个增加到该内存位置的值?

时间:2013-12-03 11:55:29

标签: c++ pointers

我理解为了它的工作需要

void increment(int *value)
{
    (*value)++;
}

这是因为它需要括号,因为优先级如何工作(如果我错了,请纠正我)。但是,当我执行以下操作时,怎么没有发生编译错误?由于没有括号,但是这个值没有改变,因为没有括号,但这究竟是什么变化?

void increment(int *value)
{
    *value++;
}

4 个答案:

答案 0 :(得分:7)

value是指向整数的指针。指针算法的规则说如果你执行value++之类的操作,那么它将指向value + sizeof(int)(以字节为单位)。

这里发生的事情是,您将解除引用value以获得一些您刚刚丢弃的右值,然后递增value(而不是它指向的东西,而不是,指针本身)。

答案 1 :(得分:2)

*value++;

它取消引用value指向的位置处的值,并由于后递增而递增指针value。实际上,它与value++相同,因为您丢弃了表达式返回的值。

But how come when I do the following, no compile error happens?

因为它是一个有效的语句,您只是丢弃表达式返回的值。同样,您可以使用以下语句:

"Random string";

 42;

它们是有效的,编译得很好(但没用)。

我们丢弃了许多标准库函数的返回值。例如。 memset()void *返回到已设置的内存,但我们很少使用它。这不是那么直观,但它完全有效。

答案 2 :(得分:0)

虽然不完全是答案:从K& R C来看,这就是memcopy的实现方式。如果您了解正在发生的优先事项,您将能够自己回答您的问题。

void *memcpy(char *ptr1, char *ptr2, size_t n) {
  void *ret = ptr1;
  while (n >0) {
    *ptr1++ = *ptr2++;
    n--;
  }
  return ret;
}

答案 3 :(得分:0)

根据运营商的precedence

++位于*

之前

因此,它被执行为

value++*。实际上,*(value++)

在这种情况下,

value++会返回value + (size of datatype pointed at)的地址,即value + (size of int)

除非你的value指向一个数组,否则你可能会获取一个垃圾值并将其解除引用。