输出说明:复杂的指针算术

时间:2011-05-05 11:28:22

标签: c pointers

我一直在努力了解这个程序的输出:

#include <stdio.h>    
int main(){
    static int arr[] = {0, 1, 2, 3, 4};
    int *p[] = {arr, arr+1, arr+2, arr+3, arr+4};
    int **ptr = p;

    ptr++;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);
    *ptr++;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);
    *++ptr;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);
    ++*ptr;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);    

    return 0;
}

OUTPUT

1 1 1
2 2 2
3 3 3
3 4 4

有人可以解释输出吗?

4 个答案:

答案 0 :(得分:8)

This is the initial snapshot

在第一次ptr ++之后,它会是: enter image description here 因此,printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr);将给出:1 1 1

在* ptr ++之后它将是:enter image description here 因此,printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr);将给出:2 2 2

在* ++ ptr之后,它将是:

enter image description here

因此,printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr);将给出:3 3 3

在++ * ptr之后,它将是:

enter image description here

因此,printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr);将给出:3 4 4

希望它有所帮助。

答案 1 :(得分:0)

您可能需要阅读the C99 Standard中的6.5.6。

基本上,指针之间的区别

  1. 他们必须指向同一个数组(或一个结束)
  2. 不同之处在于分隔指针的元素数(或者每个元素的大小,以字节为单位的字节数)。

答案 2 :(得分:0)

我将尝试仅解释第一个printf。我认为理解其余的printfs应该足够了。正如其他人注意到的那样,代码基于使用C语言中的指针算术。

arr数组包含0到4之间的五个数字。 p是一个指向整数的指针数组,它填充了arr中存储的数字的“地址”。 ptr是指向整数的指针,它用p初始化(因为在C语言中,指针数组相当于指向指针的指针)。

然后,ptr递增。请记住,我们正在递增地址,因此它现在指向(arr+1)数组中的p元素。 这就是ptr-p返回1的原因。换句话说,我们正在减去地址。

*ptr指向arr + 1元素。这就是为什么第二个值也等于1。

通过执行**ptr,我们检索存储在arr+1地址的值,它也是1.

答案 3 :(得分:0)

要考虑的主要是对指针的算术运算。

执行以下操作即add + 1 = add + 1*(size of the data type of the data which is pointed by that address)

++--也是这样。