C 输出说明:一个复杂的指针算法
我一直在努力理解这个程序的输出:C 输出说明:一个复杂的指针算法,c,pointers,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++; print
#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;
}
有人能解释一下输出吗?您可能需要阅读中的6.5.6 基本上,对于指针之间的差异
您可能需要阅读中的6.5.6 基本上,对于指针之间的差异
我将尝试仅解释第一个
printf
。我认为理解printfs的其余部分就足够了。正如其他人所注意到的,该代码是基于在C语言中使用指针算法编写的
arr
数组包含从0到4的五个数字。
p
是指向整数的指针数组,它由存储在arr
中的数字的“地址”填充。
ptr
是指向整数的指针,它用p
初始化(因为在C语言中指针数组相当于指向指针的指针)
然后,ptr
递增。请记住,我们正在递增地址,因此现在它指向p
数组中的(arr+1)
元素。
这就是为什么ptr-p
返回1。换句话说,我们在减去地址
*ptr
指向arr+1
元素。这就是为什么第二个值也等于1
通过执行
**ptr
我们检索存储在arr+1
地址的值,它也是1。我将尝试仅解释第一个printf
。我认为理解printfs的其余部分就足够了。正如其他人所注意到的,该代码是基于在C语言中使用指针算法编写的
arr
数组包含从0到4的五个数字。
p
是指向整数的指针数组,它由存储在arr
中的数字的“地址”填充。
ptr
是指向整数的指针,它用p
初始化(因为在C语言中指针数组相当于指向指针的指针)
然后,ptr
递增。请记住,我们正在递增地址,因此现在它指向p
数组中的(arr+1)
元素。
这就是为什么ptr-p
返回1。换句话说,我们在减去地址
*ptr
指向arr+1
元素。这就是为什么第二个值也等于1
通过执行**ptr
我们检索存储在arr+1
地址的值,它也是1。
在第一次ptr++之后,它将是:
因此,printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)代码>将给出:1
*ptr++之后将是:
因此,printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)代码>将给出:2
*++ptr之后,它将是:
因此,printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)代码>将给出:3
++*ptr之后,它将是:
因此,printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)代码>将给出:3 4
希望能有所帮助。
在第一次ptr++之后,它将是:
因此,printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)代码>将给出:1
*ptr++之后将是:
因此,printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)代码>将给出:2
*++ptr之后,它将是:
因此,printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)代码>将给出:3
++*ptr之后,它将是:
因此,printf(“%d%d%d\n”,ptr-p,*ptr-arr,**ptr)代码>将给出:3 4
希望它有帮助。 主要考虑的是指针上的算术运算。
执行以下操作(即地址所指数据的数据类型大小)
add+1=add+1*)
代码> ++< /代码>和<>代码> > >。
主要考虑的是指针上的算术运算。
执行以下操作(即地址所指数据的数据类型大小)
add+1=add+1*)
++
和--
也是这样。在什么情况下你会“遇到”这样的事情?这对我来说似乎是做作的、令人讨厌的、毫无意义的。@放松:我同意,这也似乎是做作的、令人讨厌的、毫无意义的,但这是从我的问题纸上抄来的。相似的问题:相似的:你在什么情况下“遇到”这样的事情?这对我来说似乎是做作的、令人讨厌的、毫无意义的。@放松:我同意,这也似乎是做作的、令人讨厌的、毫无意义的,但这是从我的问题纸上抄来的。类似的问题:类似的:Ptr指向p[1],p是p[0]。因此,差异1。这是指针的差异,希望能有所帮助。Ptr指向p[1],p是p[0]。因此,差异1。这是指针的区别,希望能有所帮助。
1 1 1
2 2 2
3 3 3
3 4 4