指向 char 的指针 - 增量运算符

Pointers to char - Increment operator

恐怕我没有正确理解运算符之间的优先级。以下程序的工作方式与预期不同:

#include<stdio.h>

int main(){
    char a[] = "abc";
    char *p;
    int i;

    p = a;
    for(i = 0; i < 3; ++i)          /* First case */
        printf("%c\n", *p++);

    printf("a = %s\n", a);

    p = a;

    for(i = 0; i < 3; ++i)        /* Second case */
        printf("%c\n", (*p)++);
    printf("a = %s\n", a);

    return 0;
}

第一种情况:根据这个table*p++就是*(p++)。我递增 p 指向的地址,然后 我取消引用它。为什么它 return 是 abc,而不是 bc + "value beyond string"

我在第二种情况下遇到了类似的问题,表达式为(*p)++。在这种情况下,括号让我增加了 p 的 dereferentiated 值。因此,我希望表达式为 return bcd 而不是 dbc

在第一种情况下它执行指针递增返回它的值之后,因为操作是post-增量。

在第二种情况下,您在循环中递增 *p, 3 次而不更改 p 本身的值。因此 a 的第一个元素(p 指向)递增 3 次导致 'a'+3='d'。其余元素保持不变

第一个案例:

迭代1:i=0,*p=a,指向'abc'。 现在在这条语句之后 p 将指向 'b' 和 i =1

迭代2:i=1,*p=b,指向'abc'。 现在在这条语句之后 p 将指向 'c' 和 i =2

迭代3:I=2,*p = c,指向'abc'。 现在在这条语句之后 p 将指向 null 终止字符并且 i=3

迭代4:循环中断,a仍然指向'abc'

第二种情况:

迭代1:i=0,*p = 'a',a指向'abc'。 在此语句之后,p 点增加的值因此指向 'bbc' 和 i=1

迭代2:i=1,*p='b',指向'bbc'。 在此语句之后,p 点增加的值因此指向 'cbc' 和 i=2

迭代3:i=2,*p='c',a指向'cbc'。 在此语句之后,p 点增加的值因此指向 'dbc' 和 i= 3

迭代 4:循环中断并且 a 指向 'dbc' p 指向 'd'