2013-03-28 114 views
12

我正在處理交換指針的函數,我找不出爲什麼這不起作用。當我在swap函數中輸出r和s時,值會被交換,這導致我相信我正在操作一個我不明白的副本,因爲我通過引用p和q來傳遞。C++交換指針

void swap(int *r, int *s) 
{ 
    int *pSwap = r; 
    r = s; 
    s = pSwap; 
    return; 
} 

int main() 
{ 
    int p = 7; 
    int q = 9; 
    swap(&p, &q); 
    cout << "p = " << p << "q= " << q << endl; 
    return 0; 
} 

打印:P = 7Q = 9

+2

您正在操作指針的副本,而不是它們指向的數據。只是'std :: swap(p,q);'更容易。或者,如果提案實際上在未來某個時候出現,「p:=:q;」。 – chris 2013-03-28 01:46:25

+3

@chris:Waaaat。你能鏈接到所述提案嗎? (搜索符號很難。) – GManNickG 2013-03-28 01:48:16

+1

@GManNickG,是的,當然。 [Here you go](http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3553.pdf)。我很懷疑它使它進入。 – chris 2013-03-28 01:48:36

回答

11

裏面你swap功能,你只是改變指針的方向,即,改變對象的指針指向(在這裏,具體地說,它是地址對象pq)。指針指向的對象根本不會改變。您可以直接使用std::swap。或如下面的代碼您的交換功能:

void swap(int *r, int *s) 
{ 
    int temp = *r; 
    *r = *s; 
    *s = temp; 
    return; 
} 
+0

我不清楚OP是否想交換指針或指針指向的值。 – 2013-03-28 01:57:04

+0

@ShafikYaghmour OP所做的就是交換指針,所以我猜OP想交換指針指向的值。 – taocp 2013-03-28 01:58:49

+0

@宋旺這是正確的。我現在看到我的錯誤。謝謝。 – 2013-03-28 01:59:57

1

r=s是設置指針r副本的指針s的副本。

相反,(如果你不想使用std:交換),你需要做到這一點

void swap(int *r, int *s) 
{ 
    int tmp = *r; 
    *r = *s; 
    *s = tmp; 
} 
1

您通過引用到你的價值觀,這是不是指針。因此,編譯器會創建臨時的(int*)並將其傳遞給該函數。

想一下pq是什麼:它們是變量,這意味着它們是在內存中的某處分配的槽(在堆棧中,但在此不重要)。你可以在什麼意義上談論「交換指針」?這不像你可以交換插槽的地址。

你可以做的是交換容納實際地址的兩個容器的值 - 那些是指針。

如果你想交換指針,你必須創建指針變量,並將它們傳遞給函數。

像這樣:

int p = 7; 
int q = 9; 

int *pptr = &p; 
int *qptr = &q; 
swap(pptr, qptr); 
cout << "p = " << *pptr << "q= " << *qptr << endl; 
return 0; 
0

你是不是通過引用傳遞在你的榜樣。此版本通過參考,

void swap2(int &r, int &s) 
{ 
    int pSwap = r; 
    r = s; 
    s = pSwap; 
    return; 
} 

int main() 
{ 
    int p = 7; 
    int q = 9; 
    swap2(p, q); 
    cout << "p = " << p << "q= " << q << endl; 
    return 0; 
} 

通過引用傳遞不同於通過值或指針傳遞。有關解釋,請參閱Web上的C++教程。我的大腦太小,不能浪費存儲細節的細胞,我可以很容易地在網上找到這些細節。

+0

交換值,而不是任何指針。通過將函數聲明爲引用,您只是更改了'swap'函數的語義。當'r'和's'是引用時'r = s'意味着當'p'和'q'是指針時與'* p = * q'相同。通過觀察存儲p和q的存儲位置來查看調試器。 – 2013-03-28 02:56:25

+0

非常感謝歐洲Micelli – 2013-03-28 10:49:26