为什么我不能做*值++;将 1 递增到该内存位置中的值?

Why can't I do *value++; to increment one to the value in that memory location?

本文关键字:内存 位置 不能 为什么      更新时间:2023-10-16

我知道要让它工作,它需要

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

这是因为它需要括号,因为优先级是如何工作的(如果我错了,请纠正我)。但是,当我执行以下操作时,为什么不会发生编译错误呢?由于没有括号,该值没有改变,这是意料之中的事,但这到底在改变什么?

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

value是一个指向整数的指针。指针算术的规则说,如果你做一个像value++这样的运算,那么之后它将指向value + sizeof(int)(以字节为单位)。

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

*value++;

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

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

因为这是一个有效的语句,而您只是在丢弃表达式返回的值。同样的方式,你可以有这样的语句:

"Random string";
 42;

它们是有效的,可以编译得很好(但毫无用处)。

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

根据操作员的优先级,

++先于*

因此,它被执行为

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

value++将向您返回value + (size of datatype pointed at)的地址,即本例中的value + (size of int)

除非你的value指向一个数组,否则你可能正在获取一个垃圾值并取消对它的引用

而不是确切的答案:来自K&RC这就是memcopy的实现方式。如果你了解正在发生的事情,你就能够自己回答你的问题。

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