2016-11-22 92 views
0

注意在代碼中我沒有使用指針,但我有一些概念,如果我要使用這個函數,當代碼塊完成時,該值將返回到正常值。交換函數 - 指針 - 混淆

但代碼編譯與實際上會用指針得到的答案。

我需要幫助,因爲我很困惑,如果我有與指針有關的犯規概念。

void swap(int i, int j) { 
    int temp = i; 
    i = j; 
    j = temp; 
} 

int main() { 
    int a = 110; 
    int b = 786; 
    cout << "Before swapping the value" << endl; 
    cout << "'a' stores the value : " << a << endl; 
    cout << "'b' stores the value : " << b << endl; 
    swap(a,b); 
    cout << "\nAfter swapping the value" << endl; 
    cout << "'a' stores the value : " << a << endl; 
    cout << "'b' stores the value : " << b << endl; 
    swap(a, b); 
    cout << "\nAnd back again swapping the value" << endl; 
    cout << "'a' stores the value : " << a << endl; 
    cout << "'b' stores the value : " << b << endl; 

    return 0; 
} 

I am getting results without using pointers - is this IDE problem

+2

什麼是你的程序的實際輸出?你期望輸出什麼?請修改您的問題以包含該問題。 –

+0

對不起,你聲稱''交換'工作或不工作,因爲這是行不通的:http://ideone.com/xzGMcl,因爲你傳遞的價值意味着它複製你的參數,並沒有給他們分配任何新的價值 – EdChum

+0

也許嘗試與宏交換:'#define swap(i,j)do {int temp = i; i = j; j = temp;} while(0)' – GPS

回答

3

看來您所包含的iostream標題還包含utility標題;並且您將std::swap的定義拉入您的程序。

既然你(沒有顯示它,但可能)在你的代碼中有using namesapce std;,那麼爲swap設置的超載包含兩個重載。並且通過重載分辨率的規則,調用正確的過載。


對於糾正一些定義,在這種情況下

+0

要改變函數名並檢查它 –

+0

我在Visual Studio 2013中創建了一個項目,包括'iostream 'header和'using namespace std;'我不能重現OP的問題。交換不起作用,這是預測的行爲。 – Philipp

+0

@菲利普,你不能假設任何標準頭文件包含其他標題,除非標準保證它(在這種情況下它不包含)。例如,[GCC再現它](http://ideone.com/k19F60)。 – StoryTeller

6

swap功能將無法在main範圍交換價值,因爲ij函數的局部變量。要獲得您期望的行爲,您應該通過參考。

void swap(int& i, int& j) { 
    int temp = i; 
    i = j; 
    j = temp; 
} 

您的密碼將爲not actually swap the values

猜測
我認爲你是using namespace std;,並從#include的一個從你與std::swap碰撞標準庫。我認爲該函數的std::版本在您的情況下被調用,這是您的代碼似乎「工作」的唯一原因。

+0

這就是要點,這裏是編譯後的圖片 - 它給了我完美的答案 - http://imgur.com/a/qc8jP –

+0

@BaqarHussain看到我的編輯。 – CoryKramer

0

如果你想使用指針交換,你應當經指針:

void swap(int *a, int*b) 
{ 
    int temp = *a; 
    *a = *b; 
    *b = temp; 
} 

按引用傳遞是另一種選擇,爲其他用戶所指出的那樣。

PS:您的查詢與函數指針無關,所以我將從您的查詢中刪除函數指針標記。

+0

對不起,我忽略了這部分。 –

+0

我正常使用這個,出於好奇心,我刪除了指針,並最終交換了值,這就是爲什麼我開始這個線程:) –