#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 有人可以解释一下吗?
答案 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}}的地址)。
因此,在主函数j
和i
的地址上调用此函数后,j
仍然是i=0
然后,当您格式化字符串并打印两个值而中间没有空格时,您将获得字符串“02”。
答案 2 :(得分:1)
在终端中运行程序时,您将在屏幕上看到02
,光标将放在第一列的下一行。这就是原因:
您设置了两个变量i=0
和j=1
。
每个变量名的内存地址都会传递给函数。
然后函数接收变量作为指针并检索实际值,它们必须被解引用(以星号为前缀)。
p=q
表示将p的内存地址设置为相同的内存地址q,这样可以使函数的第一个参数保持不变,并使i的值保持不变。
*p=2
表示将地址P的值设置为2,这也将j的值更改为2.
如果您选择删除第P=Q
行,则结果将是21
而不是02
,因为您正在修改地址P的内容,即变量i。< / p>
然后printf显示变量i和j的值,后跟一个新行。最后,程序将值0返回给任何名为它的应用程序。