📜  门| GATE-CS-2015(套装3)|第 65 题

📅  最后修改于: 2021-09-25 06:27:06             🧑  作者: 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};
}

程序的输出是_________
(一) 140
(乙) 120
(C) 100
(四) 40答案:(一)
解释:

为了简化涉及指针复杂操作的程序,我们建议您绘制适当的图表以避免愚蠢的错误。让我们假设整数是 4 字节,指针大小也是 4 字节。
让我们假设数组 a 基地址是 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贡献。

.

这个问题的测验