谁能帮我解释一下这段代码为什么这段代码的结果是“1 1 3”
#include <stdio.h>
#include <stdlib.h>
int main()
{
static int a[]={1,3,2,3,4};
int *p[]={a,a+1,a+2,a+3,a+4};
int **ptr=p;
ptr++;
printf("\n%d %d %d\n",ptr-p,*ptr-a,**ptr);
return 0;
}
最佳答案
如果您想了解更多信息,可以查找“指针算术”和/或我的答案不会有帮助。
说明:
int *p[]={a,a+1,a+2,a+3,a+4};
用指向的指针填充数组 p
数组a
中的每个元素。它相当于int *p[]={&a[0],&a[1],&a[2],&a[3],&a[4]}
。 p[0]
指向 a[0]
,p[1]
指向 a[1]
并且等等。
int **ptr=p;
然后创建指向数组 p
开头的指针。即相当于int **ptr=&p[0];
。
ptr++
递增 ptr
,以便它指向下一个元素。在这种情况下,结果与 ptr = &p[1];
相同。
然后,打印数字时:
减去指针(指针算术)意味着结果等于两个操作数之间可以容纳的元素数量。因为您之前增加了 ptr 行,所以它们正好相距 1 个元素(即 sizeof(int *)
)。 ptr
指向 p[1]
,p
指向 p[0]
。
*ptr - a
也是如此,它们相距 1 个元素(仅在这种情况下,它是 sizeof(int)
)。 *ptr
(即p[1]
)指向a[1]
,a
指向a[0]
。
而ptr
指向p[1]
,它指向a[1]
,也就是3
,因此 **ptr
为 3
。
代码警告:
正如 David Bowling 所指出的,printf
语句对提供的参数使用了错误的格式说明符。由于指针减法的结果,例如 ptr-p
,其类型为 ptrdiff_t
,正确的格式说明符为 %td
: printf( "\n%td %td %d\n",ptr-p,*ptr-a,**ptr);
使用 %d
说明符与 int
类型一起使用,与不正确的类型一起使用时会导致未定义的行为。
您可以查看对哪些类型使用哪些说明符,例如:http://www.cplusplus.com/reference/cstdio/printf/
关于c - 我想了解一些关于这段代码的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45701591/