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

What is the difference between *++a and ++*b?

在下面的程序中,'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

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

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

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

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

*c ==> 指向先前操作的增量值,即 b

让我们考虑 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.