从* ++ p和++ * p指针输出

时间:2014-12-17 07:47:03

标签: c pointers

我不明白为什么我得到以下代码的输出1,2,3。我认为它应该是1,2,2。第一次输出的原因是什么?

另外,请允许我指出,还有其他与此类指针算法和解除引用有关的问题,但这些问题的答案表明输出应为1,2,2。

int main()
{
    int p[3] = {1,2,3};
    int *q = p;
    printf("%d\n", *q);
    printf("%d\n", *++q);
    int x = ++*q;
    printf("%d\n", *q);
}

3 个答案:

答案 0 :(得分:5)

int p[3] = {1,2,3};
int *q = p;
printf("%d\n", *q);

q指向1.元素,上面打印1

printf("%d\n", *++q);

q指向2.元素,上面打印2。

int x = ++*q;

2.元素从2增加到3。

printf("%d\n", *q);

q指向2.元素,上面打印3。

答案 1 :(得分:1)

*++q被解析为*(++q); ++qq + 1)的结果被解除引用,并且副作用q递增,

++*q被解析为++(*q); *q2)的结果是++的操作数,产生3。作为副作用,*q会增加。

请记住,后缀和前缀++都有结果副作用'并且在评估表达式后不必立即应用副作用。 IOW,

a = b++ * ++c;

将被评估为

a = b * (c + 1);

bc不必更新,直到下一个序列点。

答案 2 :(得分:-1)

Hi,


         int p[3] = {1,2,3};
            int *q = p;
            printf("%d\n", *q); // The output for this line is 1
            printf("%d\n", *++q); // Pre Incrementing the 1 which becomes 2
            int x = ++*q;

     // Here we are making the x point to same location as q and then we are
    incrementing the location of the address q. Like q is pointing to the next location and so is the x.Hence the *q gives us 3 which is the value of the incremented location.



 printf("%d\n", *q);

Hope it is helpful