我一直在努力了解这个程序的输出:
#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;
}
1 1 1
2 2 2
3 3 3
3 4 4
有人可以解释输出吗?
答案 0 :(得分:8)
在第一次ptr ++之后,它会是:
因此,printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr);
将给出:1 1 1
在* ptr ++之后它将是:
因此,printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr);
将给出:2 2 2
在* ++ ptr之后,它将是:
因此,printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr);
将给出:3 3 3
在++ * ptr之后,它将是:
因此,printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr);
将给出:3 4 4
希望它有所帮助。
答案 1 :(得分:0)
您可能需要阅读the C99 Standard中的6.5.6。
基本上,指针之间的区别
答案 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)
++
和--
也是这样。