2013-03-28 68 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