微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决* ++ a和++ * 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','r'};
              /\   |
             b c   a

++*b; 之后的

char arr[] = {'b','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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。