作业帮 > 综合 > 作业

以下程序的输出结果是 #include void prt (int *x,int*y,int*z){ printf("%

来源:学生作业帮 编辑:灵鹊做题网作业帮 分类:综合作业 时间:2024/04/28 00:06:50
以下程序的输出结果是
#include void prt (int *x,int*y,int*z)
{ printf("%d,%d,%d\n",++*x,++*y,*(z++));}
main() { int a=10,b=40,c=20; prt (&a,&b,&c); prt (&a,&b,&c); }
A)11,42,31 12,22,41 B)11,41,20 12,42,20
C)11,21,40 11,21,21 D)11,41,21 12,42,22
以下程序的输出结果是 #include void prt (int *x,int*y,int*z){ printf(
void prt (int *x,int*y,int*z)
{
\x09printf("%d,%d,%d\n",++*x,++*y,*(z++));
// x和y用" * "符号取形参地址的值.进行前置自加,而*(z++),分解为(z++)是将z的值先用 * 符号取出来输出,在将地址加1,所以z的值不变,而x和y进行自加运算
}
int main() {
\x09 int a=10,b=40,c=20;
\x09 prt (&a,&b,&c); //传递给函数变量的地址
\x09 prt (&a,&b,&c);
return 0;
}
答案为:B
再问: 有两个 prt (&a,&b,&c); prt (&a,&b,&c); 第一次的话是11,41,20 但是第一次进行之后Z加一了啊, 第二次的话不应该是12,42,21吗?
再答: z是将地址加1,不是将值加一,你的地址假如是082983,而值是20,第一次改变了地址成为082984.而你的值已经先保存了,所以还是20, 当第二次调用函数的时候你又重新传递了地址082983,而值还是20,再次先赋值,在自加地址.所以在输出20
再问: 帮我再看一下这一道好吧?谢谢了~~ http://zhidao.baidu.com/question/399417133.html?quesup2&oldq=1
再答: 普通非引用的参数传递,是复制实参的值给形参.当你&a的时候,就是取a的地址赋值给形参x.而*是取出形参x所保存的值.然后对值进行自加. 而(z++)的意思是将z的地址做后置自加不是前置自加. 后置自加是将值先保存在进行自加,z现在保存的是c原来的地址.原来的地址里面的值是20. 当函数执行完毕就会释放这些地址. 给你个生动的解释. 就是有一个房子,你现在知道它的地址,你根据地址进到房子里面去给房子里面加了一件东西.而z的工作就是你进去看了一眼,然后一看地址错了,走错房间了,是旁边的房间 第二次别人又给了你同样的工作,而你通过地址去到房子已经改变了一次,你现在又去第二次给里面加一件东西,而第二次z的时候.你又进去一看,又走错了房间了,是旁边的房间