以下程序的结果? void foo(int*a, int* b) { *a = *a+*b; *b = *a-*b; *a = *a-*b; } void以下程序的结果? void foo(int*a, int* b) { *a = *a+*b; *b = *a-*b; *a = *a-*b; } void main() { int a=1, b=2, c=3; foo(&a,&b); foo(&b,&c); foo(&c,&a); printf("%d, %d, %d", a,b,c); }
2 回答
喵喔喔
TA贡献1735条经验 获得超5个赞
首先,这题考点是参数传地址的作用,传地址的作用就是在函数内部可更改外部变量的值
所以在第一次调用foo()时,在这个过程中
*a = *a+*b; --> *a=1+2=3; (注意,此时a的值已经改变,下面的语句中a的值已经是3,不在是1)
*b = *a-*b; --> *b=3-2=1;(注意a的值为上个语句中改成的3,b未更改过,为2)
*a = *a-*b; --> *a=3-1=2;(注意此时a的值再次被改变。a,b的值都已更改所以分别是3,2)
故第一次调用完后a=2,b=1,c=3。此时main函数中的abc的值已被改变
在次使用时为改变后的值
其他两次调用同理
还需要注意的是,第二次调用foo的时候,传了实参b,c的地址,此时foo函数形参a就是b,形参b就是c。要一 一对应,总的来说就是看传参的时候看传的是哪个变量,不能仅看foo函数中的变量名
森林海
TA贡献2011条经验 获得超2个赞
首先应弄清楚,foo()中的a、b不是main()中的a、b,每次调用foo()都是带入2个int类型数据地址,经foo()运算后仍存放在这2个地址内(而不是a、b地址内)返回 第一次调用foo()后,a=3,b=1,c=3(未变) 第二次调用foo()后,a=3(未变),b=3,c=1 第三次调用foo()后,a=1,b=3(未变),c=2
添加回答
举报
0/150
提交
取消
