以下程序的結果? 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
提交
取消