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

时间:2017-11-30 17:14:18

标签: c pointers operators

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

#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指向的地址,然后我取消引用它。为什么它会返回abc,而不是bc + "value beyond string"

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

第一种情况:

迭代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终止char和i = 3

迭代4:循环中断,仍然指向'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',指向'cbc'。 在此语句之后,p点的值增加,因此指向'dbc'和i = 3

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