C程序的输出,包括前/后增量和指针

时间:2015-05-17 23:52:22

标签: c++ c pointers pointer-arithmetic

我正在解决以下C代码测验的猜测输出,其中我没有得到以下输出:

(在printf之后的评论中,我已经编写了执行序列,我认为该行已执行并且让我感到困惑)

    int i;
    int *ptr = (int *) malloc(5 * sizeof(int));
    int *ptr2 = ptr;
    int *ptr3 = ptr;

    for (i=0; i<5; i++)
    {
        *(ptr + i) = i;
    }
    printf("%d ", *ptr++);   //*ptr evaluated to 0, print 0, increment ptr 
    printf("%d ", (*ptr)++); //*ptr evaluated to 1, print 1, increment ptr
    printf("%d ", *ptr);     //*ptr evaluated to 2, print 2
    printf("%d ", *++ptr);   //increment ptr, *ptr evaluated to 3, print 3 (but in actual it prints 2, why?)
    printf("%d ", ++*ptr);   //*ptr evaluated to 3, increment 3, print 4 (but in actual it prints 3, why?)

输出

0 1 2 2 3

为什么最后两个整数2和3?我觉得他们应该是3岁和4岁。

Here是理想的链接。

2 个答案:

答案 0 :(得分:3)

*ptr++

增加ptr,然后取消引用ptr的先前值,产生ptr[0](0)。

(*ptr)++

取消引用ptr,然后递增存储在那里的值,产生ptr[1](1)(但保留为2)。

*ptr

取消引用指针,产生ptr[1](2)因为我们还没有继续前进。

*++ptr

增加ptr并取消引用ptr的新值,产生ptr[2](2)。

++*ptr

取消引用ptr并增加存储的值,产生ptr[2](3)。

一般来说,理解这类问题的关键是了解operator precedence and associativity并将这些知识与仔细读取代码结合使用。在这种特定情况下,问题是步骤3,其中ptr仅被解除引用而不会递增。

答案 1 :(得分:0)

printf("%d ", *ptr);     //*ptr evaluated to 2, print 2

你实际上是指向数组的第二个值,它的值为1,直到你在前一行增加它为止