任何人都可以帮我解释一下这段代码为什么这段代码的结果是“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;
}
答案 0 :(得分:4)
你可以查找&#34;指针算术&#34;如果你想了解更多和/或我的答案无济于事。
说明:
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
类型一起使用,并在使用不正确的类型时导致未定义的行为。
您可以在此处查看要使用哪些类型的说明符:deadlocks