二、下列是 C 程式語言所撰寫的兩數對調,它使用傳址呼叫來完成,試修正下列程式錯誤的地方。程式在 main()函式中先輸入兩個整數,並印出對調前的兩數,再呼叫 swap()對調函式,最後印出對調後的兩數。輸出結果如下: (24 分)

修正後的程式碼:
#include <stdio.h>
void swap(int *, int *);
int main( ) {
int a, b;
printf("Enter two numbers: ");
scanf("%d %d", &a, &b);
printf("a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
void swap(int *x, int *y) {
int temp;
temp = *x;
*x = *y;
*y = temp;
}
修正的地方如下:
若欲達成兩數對調,則該程式錯誤之處如下-
void swap(int &x,int &y){
int temp;
temp=x;
x=y;
y=temp;
}
int main(){
...
swap(*a,*b);
...
}
在進行call by address時,swap函數要接收的應是a和b兩個變數的記憶體位址,而非兩個變數的值,若只有傳值進入函數,就等同於將該值複製一份到函數,而函數的兩個變數x和y又有自身的記憶體位址,因此等到函數運算結束之後,其運算結果就會跟著消失(除非回傳的值是x和y),而a和b並不會因為函數運算完成後就交換,因為改變記憶體位址的是x和y,而非a和b,故原先的a和b依舊維持不變;但若傳入的值是記憶體位址,函數就會用x和y來接收a和b的記憶體位址,並進行互換,這個舉動會實際更動到a和b的記憶體位址,因此call by address會時會將兩個值進行互換。