2013-04-17 45 views
0

我寫了一個叫swap的函數,給出了函數內給定的兩個元素。但是當我在另一個功能中使用它時,它不起作用。如何讓它工作?在函數內改變給定的函數參數C++

#include <iostream> 
using namespace std; 
void swap(int *a, int * b){ 
    int temp=*a; 
    *a=*b; 
    *b=temp; 
} 

void sum(int x, int y){ 
    int *a; 
    a = &x; 
    int *b; 
    b=&x; 
    swap(a,b); 
    //cout << x << endl << y << endl; 
} 
int main(){ 
    int a=0, b=1; 

    //swap(a,b); 
    sum(a,b); 
    cout << a << endl << b << endl; 
    return 0; 
} 
+1

有兩件事:第一,調用一個函數'sum'非常奇怪,它使用兩個整數,但既不返回整數也不計算總和。第二:你不應該使用指針。這是可怕的C風格,而不是C++ – stefan

回答

1
b=&x; 

應該

b=&y; 

而且,你是交換的本地副本。 sum應該是:

void sum(int& x, int& y) 

此外,這已經存在。它被稱爲std::iter_swap

0

xy是按值傳遞給sum所以swap正在本地副本,而不是實際的變量從main。您還需要修改sum和您的電話交換:

void sum(int &x, int &y) 
      ^ ^
{ 
// other code 
swap(&x,&y); 
    ^^ 
} 

如果你離開你打電話swap這樣的:

swap(x,y); 

你會實際調用std::swap。我打算假設您將向sum添加更多代碼,否則該名稱與它的作用不一致。

0

您不在交換,但在sum函數中,您將x和y傳遞給值,然後修改並交換值的副本以解決此問題,您需要將void sum(int x, int y){更改爲void sum(int& x, int& y){,這將導致x和y被傳遞以便總和能夠更新它們。

0

我猜'錯誤'你的意思是最後一個cout的輸出結果並不像你所期望的那樣顯示'a'和'b'。但是你把它們傳遞給'總和'的價值。

0

我假設你只是學習指針和引用。

您的功能swap交換兩個指針的內容。請注意,您已投入using namespace std,並且std還具有交換功能,因此我建議您從源代碼中移除該交換功能,儘管如果您通過指向整數的指針傳遞,則會更接近匹配。

你的函數sum是一個明顯的誤稱,因爲它實際上並沒有求和或添加任何東西,它試圖通過調用指針版本來進行交換。

要修復您的特定錯誤,它將不得不通過參考採用其參數,b應該指向y而不是x。