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

詳解 (共 2 筆)
修正後的程式碼:
#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;
}
修正的地方如下:
- 在呼叫scanf函式時,需要將變數a和b的記憶體位址傳遞給scanf函式,因此修正為scanf("%d %d", &a, &b);
- 在swap函式的參數宣告中,需要使用指標類型的參數,因此修正為void swap(int *x, int *y)
- 在swap函式中,對傳入的指標進行解參考(dereference)操作,以訪問和修改所指向的變數的值,因此修正為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會時會將兩個值進行互換。