易百教程

65、以下C语言代码的输出是什么?

#include <stdio.h>
#include <stdlib.h>
#define ALLOC_MEMORY 5
int main()
{
    int loop = 0;
    int *ptr = malloc(ALLOC_MEMORY *sizeof(int));
    if(ptr == NULL)
    {
        perror("fail to allocate memory");
        return -1;
    }
    for(loop=0; loop < ALLOC_MEMORY; ++loop)
    {
        *(ptr + loop) = loop;
    }
    printf(" %d",*ptr++);
    printf(" %d",(*ptr)++);
    printf(" %d",*ptr);
    printf(" %d",*++ptr);
    printf(" %d",++*ptr);
    free(ptr);
    return 0;
}

上面示例代码输出结果是:0 1 2 2 3

解释:
第一个 printf:*ptr++ 意味着它将增加地址并取消引用该地址,但这里的增量是一个后增量,所以首先和之后取消引用,所以在基地址上你得到 0(ptr 指向下一个位置)。
第二个 printf: (*ptr)++ 第一次取消引用,然后增加值,所以位置值是 1 是增量,所以得到 2(这里的指针没有改变)。
第三个 printf: *ptr 表示当指针指向该位置时取消引用,所以得到 2
第五个 printf:*++ptr 表示第一个指针在取消引用后递增,因此得到 2(指针已更改)。
第六个 printf: ++*ptr 表示第一次取消引用,然后增加值,所以得到 3