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

C中包含复杂指针的代码的输出,c,pointers,C,Pointers,我在一次采访中,他们问我: 如果编译以下代码,会发生什么?它会成功编译吗?如果是,输出是什么 我没有答案。这比我解决的问题要复杂得多 然后他们回答说: 输出将是: 回家后,我也无法真正理解它是如何工作的。有人能给我解释一下吗?谢谢你的帮助 让我们用一些任意地址号来表示数组a的地址,以便更好地理解(不考虑int的大小) a[]={0,1,2,3,4} 地址值 1000 = 0 1001 = 1 1002 = 2 1003 = 3 1004=4 现在int*p[]=

我在一次采访中,他们问我:

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

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

然后他们回答说:

输出将是:


回家后,我也无法真正理解它是如何工作的。有人能给我解释一下吗?谢谢你的帮助

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

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

地址值
1000   =   0 
1001   =   1
1002   =   2
1003   =   3
1004=4

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

地址值
2000=1000(a[0]表示地址,+1表示a[1]表示地址,依此类推)
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

您也可以通过解释它将被编译来获得一些面试要点,但对于试图将指针差异打印为普通整数,会有一系列格式警告。@DavidC.Rankin:C中函数之外的语句?这是不可能的。
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