📜  C 程序的输出 | 12套

📅  最后修改于: 2022-05-13 01:56:10.952000             🧑  作者: Mango

C 程序的输出 | 12套

预测以下程序的输出。

问题 1

int fun(char *str1)
{
  char *str2 = str1;
  while(*++str1);
  return (str1-str2);
}    
  
int main()
{
  char *str = "geeksforgeeks";
  printf("%d", fun(str));
  getchar();
  return 0;
}

输出:13
在 fun() 中,指针 str2 被初始化为 str1 并且 str1 被移动直到到达 '\0' (注意在 while 循环之后)。所以 str1 将增加 13(假设 char 占用 1 个字节)。

问题2

void fun(int *p)
{
  static int q = 10;
  p = &q;
}    
  
int main()
{
  int r = 20;
  int *p = &r;
  fun(p);
  printf("%d", *p);
  getchar();
  return 0;
}

输出:20
在 fun() 中,q 是指针 p 的副本。因此,如果我们将 q 更改为指向其他内容,则 p 不受影响。



问题 3

void fun(int **p)
{
  static int q = 10;
  *p = &q;
}    
  
int main()
{
  int r = 20;
  int *p = &r;
  fun(&p);
  printf("%d", *p);
  getchar();
  return 0;
}

输出 10

请注意,我们将 p 的地址传递给 fun()。 fun() 中的 p 实际上是指向 main() 中 p 的指针,我们正在更改 fun() 中 p 的值。所以 main 的 p 变成了 fun() 的 q 点。为了更好地理解它,让我们将 fun() 中的 p 重命名为 p_ref 或 ptr_to_p

void fun(int **ptr_to_p)
{
  static int q = 10;
  *ptr_to_p = &q;  /*Now p of main is pointing to q*/
}

另外,请注意该程序不会引起任何问题,因为 q 是一个静态变量。即使在函数返回之后,静态变量也存在于内存中。对于自动变量,我们可能会看到一些奇怪的输出,因为函数返回后自动变量可能不存在于内存中。