交换两个指针

Swapping two pointers

本文关键字:两个 指针 交换      更新时间:2023-10-16

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

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;

但地址似乎没有改变。

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

函数按值接受指针,因此它所做的任何修改在返回后都不可见。实际上,您正在交换指针的副本的值。

您要做的是std::swap

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

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

您的函数之外,x就是int
内部您的函数x是一个pointer-to-int
这就是你困惑和烦恼的根源。

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

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

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;
}