* ++ a和++ * b有什么区别?

时间:2020-11-10 05:20:59

标签: c pointers post-increment pre-increment

在下面的程序中,'c'指针尚未修改。不过,它仍在打印数组的第二个元素,而不是第一个元素,即“ a”。谁能解释这种行为?前两个字符正确打印,但第三个字符不正常。

#include <stdio.h>
int main()
{
    char arr[] = {'a','m','r'};
    char *a = arr;
    char *b = arr;
    char *c = arr;
    
    *++a;
    ++*b;
    
    printf("%c %c %c",*a,*b,*c);

    return 0;
}

输出:

m b b

3 个答案:

答案 0 :(得分:2)

char arr[] = {'a','m','r'};
              /|\
             a b c

*++a; 之后的

char arr[] = {'a','m','r'};
              /\   |
             b c   a

++*b; 之后的

char arr[] = {'b','m','r'};
              /\   |
             b c   a

答案 1 :(得分:1)

最初abc都指向数组的第一个元素。

*++a; ==>该操作将地址递增,因此它将指向下一个位置并尊重其中的值,因此它将指向下一个位置,即m

++*b; ==>在这里,您要递增b中包含的值,即a,因此递增后它变成b

* c ==>指向上一个操作的增量值,即b

答案 2 :(得分:0)

让我们考虑prefixpostfix*解引用运算符的优先级和关联性。

  1. 优先级:Postfix的优先级高于* dereference operatorprefix运算符。但是prefix* dereference operator具有相同的优先级。我们必须考虑相同优先级运算符的关联性。

  2. 关联性:prefix* dereference operator的从右到左。

  3. 最初,abc存储数组的第一个元素的地址。

  4. *++a可以表示为*(++a),因为关联性是从右到左。 (请注意:prefix* dereference operator具有相同的优先级。)

  5. 因此,*(++a) = *(a+1) = m

  6. ++*b可以表示为++(*b) = ++(a) = b(自*b = a起)

  7. 自此以来,数组第一个地址的值已更改,*c = b