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

时间:2016-01-02 03:55:40

标签: c pointers

我在接受采访时问他:

  

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

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

回家后我也无法理解它是如何运作的。有人可以向我解释一下吗?任何帮助赞赏。

1 个答案:

答案 0 :(得分:3)

让我们用一些任意的地址号来表示数组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;是指向另一个指针的指针。所以它基本上指向数组p的第一个地址2000,其值为1000

ptr++;将指针ptr推进一步。所以它现在指向p的第二个地址2001,其值为1001

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

ptr的值为2001p的值为2000(因为p表示p[0]的地址)。所以区别在于2001-2000 = 1

*ptr的值为1001a的值为1000。所以区别在于1001-1000 = 1

**ptr的值为1.因为ptr=2001*ptr = 1001**ptr = 1(地址1001的值)