交换两个指针

时间:2013-08-28 21:31:27

标签: c++ pointers

我正在尝试编写一个函数,它将两个指针作为参数,然后使第一个指针指向第二个指针所指向的对象,第二个指针指向第一个指向的对象。

void swap(int *x, int *y)
{
    int *s;
    s = x;
    x = y;
    y = s;
}

在主要功能中,我会做类似

的事情
int x, y;
swap(&x, &y);
std::cout << &x << " " << &y << std::endl;

但似乎地址不会改变。

如果我取消引用指针并尝试更改值,则按预期交换值。我想知道为什么这个函数不会改变指针指向的位置。

3 个答案:

答案 0 :(得分:4)

您的函数按值接受指针,因此它返回后将无法显示任何修改。实际上,您正在交换指针的副本的值。

答案 1 :(得分:4)

您要做的是std::swap

template <class T> void swap ( T& a, T& b )
{
  T c(a); a=b; b=c;
}

答案 2 :(得分:1)

当您使用相同的变量名称来表示两种不同的事物时,您几乎总是会使自己的工作更加困难。

外部您的功能,xint 内部您的功能xpointer-to-int 这是你困惑和麻烦的根源。

我的代码交换变量的地址 (事实上,我认为这是不可能的;编译器决定x的地址。你不能改变它。
你只能改变存储在该地址的值。)
< / p>

但我认为这就是你想要的:

void swap(int *ptr_x, int *ptr_y)
{
    int temp;
    temp = *ptr_x;
    *ptr_x = *ptr_y;
    *ptr_y = temp;
}

int main(void)
{
    int x=5, y=9;
    swap(&x, &y);
    std::cout << &x << " " << &y << std::endl;  // Sorry, Address of X and Y will always be the same
    std::cout << x << " " << y << std::endl;  // Now x is 9 and y is 5.

    return 0;
}