2016-05-17 56 views
0

仍然是一般的編程noob。我知道這段代碼不起作用,但爲什麼?使用指針的交換功能有什麼問題?

void swap(int num1, int num2) 
{ 
    int* p_first =& num1; 
    int* p_sec =& num2; 
    *p_first = num1; 
    *p_sec = num2; 
} 
+0

應爲:'void swap(int&num1,int&num2)'或'void swap(int * num1,int * num2)'並相應地調整您的代碼。你的參數,因爲它們是通過複製而不是引用或指針,所以你交換本地整數副本。 SO和互聯網上有很多例子。 – Brandon

+2

相關,實際上,無論你從哪裏調用,都應該簡單地使用'std :: swap'。除非你在學術上被迫這樣做,否則無需重新發明輪子。 – WhozCraig

+0

如果你不知道爲什麼,你怎麼知道代碼不起作用?你對「不工作」的定義是什麼?你應該提取一個最簡單的例子,包括髮生了什麼事以及你期望發生什麼。 –

回答

2

該函數由值取它的參數,這意味着該功能只對num1num2臨時副本運行。函數修改這些值,然後當它返回時,它將拋出臨時值,並保留不變的實值。

解決此問題的慣用C++方法是通過引用而不是值傳遞參數。

void swap(int &num1, int &num2) { 
    auto temp = num1; 
    num1 = num2; 
    num2 = temp; 
} 

int x = 5, y = 7; 
swap(x, y); 

或者,您可以通過指針傳遞參數。這是習慣C的方式(因爲C沒有引用)。缺點是它強制調用者的代碼傳遞其參數的地址,而不是參數本身。

void swap(int *num1, int *num2) { 
    int temp = *num1; 
    *num1 = *num2; 
    *num2 = temp; 
} 

int x = 5, y = 7; 
swap(&x, &y); 

當然,交換兩個數字,最好辦法就是不要推倒重來,而是使用std::swap,它已經爲你寫的。

int x = 5, y = 7; 
std::swap(x, y); 
1

你的函數什麼都不做,它看起來像一個無輸出函數。

的原因是: num1num2是堆棧變量,他們的地址分配給p_firstp_sec這也是堆棧變量。每次執行代碼時,堆棧變量的地址都會更改。

如果您想更換num1num2爲什麼您將值分配給其他兩個變量(這沒有意義)。

至少你應該這樣想交換它們:

temp = num1 
num1 = num2 
num2 = temp 

因爲C++會如果你聲明這樣

void swap(int num1, int num2) 

,所以你需要使用剛剛通價值發揮作用指針或引用來完成它(詳細實現可以輕鬆搜索):

void swap(int* num1, int* num2) //pointer parameter 
void swap(int& num1, int& num2) //reference parameter 
-2

1 - 在交換功能中,您正在使用按值調用,因此您無法將結果返回到調用者函數中。

2 - 實現如下功能 - >

void swap(int num1, int num2) { 
    int temp; 
    int* p_first =&num1; 
    int* p_sec =&num2; 
    temp = *p_first; 
    *p_first = *p_sec; 
    *p_sec = temp; 
    printf("\n %d %d \n",num1,num2); 
} 

交換將現在的工作。

+0

我不是選民。代碼很糟糕。你期望一個'swap'函數來做控制檯I/O嗎? 'printf'?就像'strlen'在控制檯上輸出字符串的長度一樣,而不是返回。 – Ajay

+0

由於上述原因,我_am_ downvoter。你的'swap'會複製。重點是什麼?爲什麼有人想調用一個函數,傳入兩個值,並將這些值以不同的順序打印?等價函數就是'void swap(int n1,int n2){std :: cout << n2 <<「」<< n1 << std :: endl};' – Tas