有原因的程序输出是什么?

时间:2015-10-02 18:45:46

标签: c pointers

#include<stdio.h>
void f(int *p,int *q){
    p=q;
    *p=2;
}
int main(){
    int i=0,j=1;
    f(&i,&j);
    printf("%d%d\n",i,j);
    return 0;
}

该程序的输出为02 有人可以解释一下吗?

3 个答案:

答案 0 :(得分:4)

请参阅注释:

#include <stdio.h>

void f(int *p, int *q) // p contains address of i, q contains address of j
{
  p=q;                 // p now contains address of j
  *p=2;                // assigns 2 to j, not i
}

int main()
{
  int i=0,j=1;               // i contains 0, j contains 1
  f( &i, &j );               // call f with pointers to i and j
  printf( "%d%d\n", i, j );  // after call to f, i is unchanged, j contains 2
  return 0;
}

输出将是02,而不是21或22.您所指的答案页不正确。

修改

生活中令人遗憾的事实是,许多教授C编程的人都不熟悉这种语言。

答案 1 :(得分:1)

首先,输出应为02。

void f(int *p,int *q){
    p=q;
    *p=2;
}

上面的函数需要两个int指针(或地址),并使它们都指向同一个东西(p=q表示p指向q所做的任何一个,或p是与q相同的地址然后将指向的值更改为2(使用解除引用运算符*p)。由于问题中的main()函数使用f()的地址调用int,因此会更改第二个参数地址int的值(在本例中为{{ 1}}的地址)。

因此,在主函数ji的地址上调用此函数后,j仍然是i=0

然后,当您格式化字符串并打印两个值而中间没有空格时,您将获得字符串“02”。

答案 2 :(得分:1)

在终端中运行程序时,您将在屏幕上看到02,光标将放在第一列的下一行。这就是原因:

  1. 您设置了两个变量i=0j=1

  2. 每个变量名的内存地址都会传递给函数。

  3. 然后函数接收变量作为指针并检索实际值,它们必须被解引用(以星号为前缀)。

  4. p=q表示将p的内存地址设置为相同的内存地址q,这样可以使函数的第一个参数保持不变,并使i的值保持不变。

    < / LI>
  5. *p=2表示将地址P的值设置为2,这也将j的值更改为2.

  6. 如果您选择删除第P=Q行,则结果将是21而不是02,因为您正在修改地址P的内容,即变量i。< / p>

    然后printf显示变量i和j的值,后跟一个新行。最后,程序将值0返回给任何名为它的应用程序。