大门|大门-CS-2015(第三组)|问题65

考虑下面的C程序。

null

# include
int main( )
{
static int a[] = {10, 20, 30, 40, 50};
static int *p[] = {a, a+3, a+4, a+1, a+2};
int **ptr = p;
ptr++;
printf ( "%d%d" , ptr - p, **ptr};
}


程序的输出是_________ (A) 140 (B) 120 (C) 100 (D) 40 答复: (A) 说明:

为了简化涉及指针复杂操作的程序,我们建议您绘制适当的图表,以避免愚蠢的错误。假设整数是4字节,指针大小也是4字节。 假设一个数组的基址是1000。数组名实际上包含数组基址。

pranjul_36

假设数组p的基址是2000。

pranjul_36_1

双指针ptr基址为3000。

pranjul_36_2

现在ptr实际上指向数组p的第一个元素。ptr++将使它指向数组p的下一个元素。它的值将更改为2004。 指针算法的规则之一是,当你减去两个指针时,只要它们指向同一个数组,结果就是分隔它们的元素数。 ptr指向第二个元素,p指向第一个元素,因此ptr-p将等于1(不包括ptr指向的元素)。 现在ptr=2004–>*(2004)=1012–>*(1012)–>40。

因此,最终的答案是 140 .

这个解决方案是由 Pranjul Ahuja .

.

这个问题的小测验

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享