指针间接问题

时间:2014-08-18 09:58:54

标签: c++ c pointers gcc

这个程序产生0 1 1作为我预期输出的输出0 1 2.有人可以解释为什么增量运算符不作为前缀工作吗?

#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)++);
    printf("%d ", *ptr);
    printf("%d ", *++ptr);
    return 0;
}

6 个答案:

答案 0 :(得分:6)

假设int *p = ptr

printf("%d ", (*ptr)++);  // print ptr[0] then increment ptr[0] ==> 0
printf("%d ", *ptr);      // print ptr[0] ==> 1
printf("%d ", *++ptr);    // increment ptr then effectively print p[1] ==> 1

答案 1 :(得分:3)

*++ptr等效于*(++ptr):递增ptr,然后取消引用递增的指针。第三个++(*ptr)中的printf将提供所需的输出。

答案 2 :(得分:2)

    printf("%d ", (*ptr)++);

您正在增加内存位置*ptr内的数字ptr;你不要触摸指针ptr本身。

在此printf之前,ptr[0]包含0.您递增了它。

答案 3 :(得分:1)

++(* ptr)怎么样?这比三行中第一行的后缀更好。

您的原始代码正在有效地执行*(++ ptr),这不是您所期待的。

答案 4 :(得分:0)

这是因为通过执行:

答案 5 :(得分:0)

存储在指针中的地址保持不变,直到程序终止。  这两个语句printf("%d ", (*ptr)++); printf("%d ", *++ptr);会增加存储在ptr中的值。第一个语句是后增量,第二个是preinrement`

要递增地址,您可以使用++ ptr。