指针算术

时间:2017-12-12 12:03:37

标签: c pointers pointer-arithmetic

我做了一次递归练习,我无法理解做*p++*p+=1.

之间的区别

它们都应该在指向的值上加1,但由于某种原因,*p+=1有效,而*p++则没有。

void rec(char a[], int *p ,int i)
{
    if(a[i+1]== '\0')
        return;

    if(a[i]==a[i+1])
        *p+=1;

    rec(a, p, i+1);
}


void rec(char a[], int *p ,int i)
{
    if(a[i+1]== '\0')
        return;

    if(a[i]==a[i+1])
        *p++;

    rec(a, p, i+1);
}

2 个答案:

答案 0 :(得分:1)

*p += 1;表示取消引用指针p,然后将解除引用的值增加1。虽然*p++;表示

*p;
p += 1; // Increment the pointer itself  

这是因为++的优先级高于*运算符,因此编译器会将其解析为*(p++);

(*p)++相当于*p += 1;

答案 1 :(得分:1)

优先顺序

++ > * > +=

此处*p+=1正在增加p指向的值。这里p指向的内存位置的值递增。您可以在代码中看到更改。

在第二种情况下,*p++它只是增加指针p,然后它取消引用该值,但您不会在任何地方分配该r值。这不会改变p所指向的内存中的实际内容。

这就是为什么在第二种情况下你没有看到工作变量有任何变化,并得出结论认为它不起作用,但肯定不是这样。