C程序输出混乱(指针)

时间:2014-04-09 19:39:44

标签: c pointers

#include <stdio.h>

int main(void)
{
    int i;
    int *ptr = (int *) malloc(5 * sizeof(int));

    for (i=0; i<5; i++)
        *(ptr + i) = i;

    printf("%d ", *ptr++);//prin1
    printf("%d ", (*ptr)++);//print2
    printf("%d ", *ptr);//print3
    printf("%d ", *++ptr);//print4
    printf("%d ", ++*ptr);//print5
}

我正在

0 1 2 2 3

作为输出。

我无法理解为什么“print4”正在打印2它应该打印3作为指针* ++ ptr将被视为*(++ ptr),即指针将首先递增

4 个答案:

答案 0 :(得分:5)

*ptr++ - &gt;打印0,按ptr增加1 (*ptr)++ - &gt;打印1,将1增加到2 *ptr - &gt;打印存储的增量值,即2 *++ptr - &gt;按ptr增加1,然后打印ptr指向的值2
++*ptr - &gt;增加值2,由ptr指出,然后打印,即3

答案 1 :(得分:3)

在C中,最好不要投射malloc()的结果。这样做可以隐藏编译器可能会发出警告的错误,最坏情况下的错误可能会导致程序崩溃。

    int *ptr = malloc(5 * sizeof(int));

ptr现在指向5 int的内存,并在循环中使用连续值初始化它们。在循环结束时,情况可以这样显示:

   +---+---+---+---+---+
   | 0 | 1 | 2 | 3 | 4 |
   +---+---+---+---+---+
     ^
    ptr

现在,我们可以绘制一张图片以对应每行代码。

printf("%d ", *ptr++);//prin1       +---+---+---+---+---+
                                    | 0 | 1 | 2 | 3 | 4 |
                                    +---+---+---+---+---+
                                          ^
                                         ptr

由于使用了后期增量,因此会打印0,并且ptr会递增。

printf("%d ", (*ptr)++);//print2    +---+---+---+---+---+
                                    | 0 | 2 | 2 | 3 | 4 |
                                    +---+---+---+---+---+
                                          ^
                                         ptr

打印取消引用的值1,然后后递增,因此它变为2ptr没有移动。

printf("%d ", *ptr);//print3        +---+---+---+---+---+
                                    | 0 | 2 | 2 | 3 | 4 |
                                    +---+---+---+---+---+
                                          ^
                                         ptr

现在,打印出取消引用的值2,并且没有任何更改。

printf("%d ", *++ptr);//print4      +---+---+---+---+---+
                                    | 0 | 2 | 2 | 3 | 4 |
                                    +---+---+---+---+---+
                                              ^
                                             ptr

ptr上的预增量将其移至下一个元素,并打印解除引用的值2

printf("%d ", ++*ptr);//print5      +---+---+---+---+---+
                                    | 0 | 2 | 3 | 3 | 4 |
                                    +---+---+---+---+---+
                                              ^
                                             ptr

取消引用的值2已预先递增,因此会打印值3

答案 2 :(得分:0)

那是因为你在print3上没有增加。

答案 3 :(得分:0)

您可能无法理解ptr在流程中指向的位置......下面的额外注释是否会将其清除?

printf("%d ", *ptr++);  // ptr now point to ptr[1] which is initialized to 1
printf("%d ", (*ptr)++);// update ptr[1] to 1+1 = 2
printf("%d ", *ptr);    //  printing the value pf ptr[1]
printf("%d ", *++ptr);  // incrementing ptr, to pointing to ptr[2] which 
                        // is initialized to 2....
printf("%d ", ++*ptr);  // incrementing the value of ptr[2] to (2+1) = 3