我想知道这段代码

时间:2017-08-15 21:09:33

标签: c

任何人都可以帮我解释一下这段代码为什么这段代码的结果是“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;
}

1 个答案:

答案 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,因此**ptr3

代码警告:

正如David Bowling所指出的,printf语句对提供的参数使用了错误的格式说明符。指针扣除的结果(例如ptr-p)的类型为ptrdiff_t,正确的格式说明符为%tdprintf("\n%td %td %d\n",ptr-p,*ptr-a,**ptr);

使用%d说明符与int类型一起使用,并在使用不正确的类型时导致未定义的行为。

您可以在此处查看要使用哪些类型的说明符:deadlocks

相关问题