在c與c++中,有多種辦法可以通過函數交換傳入的兩數的值,但有容易有一些問題產生,因而本文將幾種交換方式及容易出錯的點進行了分類。
1.傳引用
這是c++中最常見方式
如下:
int swap1 (int &a,int &b) { int c; c=a;a=b;b=c; cout<<"a1:"<<a<<";b1:"<<b<<endl; }
2.傳指針
int swap2 (int *a,int *b) { int c; c=*a;*a=*b;*b=c; cout<<"a2:"<<*a<<";b2:"<<*b<<endl; }
以上是兩種正確而常用的辦法。然而使用中也會有一些錯誤的使用,具體如下:
3.傳指針但是使用出錯,只交換了地址。
int swap3 (int *a,int *b) { int *c; c=a;a=b;b=c; cout<<"a3:"<<*a<<";b3:"<<*b<<endl; }
這里實際輸出后,會發現傳入的值並未發生交換,這是因為實際上此處的交換是指針的交換,即將a、b的地址值進行的交換而不是a和b本身的值,最后用*得到指針所指的值仍然是原順序,當然指向a的指針的地址發生了交換,但是最終用這個交換的指針取值還是原a值。
4.常見錯誤,即未將函數中局部變量與傳入的原變量區分清楚。
int swap4 (int a,int b) { int c; c=a;a=b;b=c; cout<<"a4:"<<a<<";b4:"<<b<<endl; }
5.修改3發生的錯誤后,此為正確交換
int swap5 (int *&a,int *&b) { int *c; c=a;a=b;b=c; cout<<"a5:"<<*a<<";b5:"<<*b<<endl; }
這里將傳入的變量換成了int *&類型,此時交換即可正常。