C中包含复杂指针的代码输出

阿什什(Ashish)

我在一次采访中问他们:

如果编译以下代码会发生什么?可以成功编译吗?如果是,输出结果是什么?

static int a[ ] = {0,1,2,3,4};
int *p[ ] = {a,a+1,a+2,a+3,a+4};
int **ptr = p;
ptr++;
printf(“\n %d %d %d”, ptr-p, *ptr-a, **ptr);
*ptr++;
printf(“\n %d %d %d”, ptr-p, *ptr-a, **ptr);
*++ptr;
printf(“\n %d %d %d”, ptr-p, *ptr-a, **ptr);
++*ptr;
printf(“\n %d %d %d”, ptr-p, *ptr-a, **ptr);

我没有答案 这比我解决的问题复杂得多。

然后他们回答:

输出将是:

111
222
333
344

回家之后,我实际上还无法理解它是如何工作的。有人可以向我解释吗?任何帮助表示赞赏。

穆尼尔·侯赛因

a为了更好地理解(不考虑int的大小),让我们用一些任意地址号表示数组的地址。

a[] = {0,1,2,3,4}

address value 1000 = 0 1001 = 1 1002 = 2 1003 = 3 1004 = 4

现在int *p[ ] = {a,a+1,a+2,a+3,a+4};是一个指针数组。因此,它基本上保留了一些地址。让我们也为这个数组假设一些任意地址

address value 2000 = 1000 (a means address of a[0] and a+1 means address of a[1] and so on) 2001 = 1001 2002 = 1002 2003 = 1003 2004 = 1004

int **ptr = p;是指向另一个指针的指针。因此它基本上指向的数组的第一个地址p2000,其值为1000

ptr++;将指针前ptr进一步。因此,它现在指向第二个地址p2001同一个值1001

现在printf(“\n %d %d %d”, ptr-p, *ptr-a, **ptr);

的值ptr就是2001和值的p2000(因为p手段地址p[0])。所以区别是2001-2000 = 1

的值*ptr就是1001和的值a就是1000所以区别是1001-1000 = 1

的值为**ptr1 ptr=2001.。*ptr = 1001**ptr = 1(地址值1001

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章