📜  门| GATE-CS-2015(Set 3)|第65章

📅  最后修改于: 2021-06-28 23:38:55             🧑  作者: Mango

考虑下面的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。实际上,数组名称包含数组的基地址。

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贡献。

这个问题的测验