我在接受采访时问他:
如果编译以下代码会发生什么?它会成功编译吗?如果是,那将是什么输出?
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
回家后我也无法理解它是如何运作的。有人可以向我解释一下吗?任何帮助赞赏。
答案 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
的值为2001
,p
的值为2000
(因为p
表示p[0]
的地址)。所以区别在于2001-2000 = 1
*ptr
的值为1001
,a
的值为1000
。所以区别在于1001-1000 = 1
**ptr
的值为1.因为ptr=2001
。 *ptr = 1001
和**ptr = 1
(地址1001
的值)