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