【问题标题】:What is the difference between *++a and ++*b?*++a 和 ++*b 有什么区别?
【发布时间】:2021-02-22 01:27:28
【问题描述】:

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

【问题讨论】:

  • ++*b; 这里是增加数组的内容。
  • 好吧,因为cb 指向同一个地方...

标签: c pointers post-increment pre-increment


【解决方案1】:
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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-07-03
        • 1970-01-01
        • 2018-06-27
        • 2013-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-09
        • 2010-11-27
        相关资源
        最近更新 更多