C中*PTR+=1与*PTR++的差异

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

这是我的示例代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int* allocateIntArray(int* ptr, int size){
    if (ptr != NULL){
        for (int i = 0; i < size; i++){
            ptr[i] = i;
        }
    }
    return ptr;
}

void increasePointer(int** ptr){
    if (ptr != NULL){
        *ptr += 1; /* <----------------------------- This is line 16 */
    }
}

int main()
{
    int* p1 = (int*)malloc(sizeof(int)* 10);
    allocateIntArray(p1, 10);

    for (int i = 0; i < 10; i++){
        printf("%d\n", p1[i]);
    }

    increasePointer(&p1);
    printf("%d\n", *p1);
    p1--;
    free(p1);
    fgets(string, sizeof(string), stdin);
    return 0;
}

问题发生在第16行,当我修改*ptr+=1*ptr++,预期的结果应该是整个数组和数字1,但是当我使用*ptr++结果是0。

有什么区别吗+=1++是吗?我以为他们是一样的。

提问于
用户回答回答于

差异是由于运算符优先。

增量后算子++具有比取消引用运算符更高的优先级。所以*ptr++等于*(ptr++),换句话说,POST增量修改的是指针,而不是指针所指向的内容。

赋值算子+=具有比取消引用运算符更低的优先级。所以*ptr+=1等于(*ptr)+=1,换句话说,赋值运算符修改指针指向的值,而不更改指针本身。

用户回答回答于

你的问题所涉及的3个操作员的优先次序如下:

后增量++>取消*>分配+=

在解析表达式时,列在某一行上的运算符与其参数的绑定(就像用圆括号一样)将比在其下方的行上列出的任何运算符都要严格。例如,表达式*p++被解析为*(p++),而不是(*p)++.

长话短说,为了表达这个任务*ptr+=1使用后增量运算符,您需要将括号添加到deeference运算符中,以使该操作优先于++就像这个(*ptr)++

扫码关注云+社区