考虑下面的C程序。
# 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。实际上,数组名称包含数组的基地址。
假设数组p的基地址为2000。
双指针ptr基地址为3000。
现在,ptr实际上指向数组p的第一个元素。 ptr ++将使其指向数组p的下一个元素。然后其值将更改为2004。
指针算术规则之一是,当您减去两个指针时,只要它们指向同一数组,结果就是将它们分开的元素数。
ptr指向第二个元素,p指向第一个元素,因此ptr-p等于1(不包括ptr指向的元素)。
现在ptr = 2004 ––> *(2004)= 1012 —> *(1012)—> 40。
因此,最终答案是140 。
该解决方案由Pranjul Ahuja贡献。
。
这个问题的测验