如何用指针交换两个变量

How to swapping two variables with a pointer

我有一个问题,我无法创建一个用指针交换两个变量的简单程序。我这样试过:

int main() {

int x=5, y=10;
int *p=nullptr;

p=&x;
y=*p;
x=y;

cout<<x<<" "<<y;
}

我该怎么办?

void swap(int *x, int *y)
{
    int tmp;

    tmp = *x;
    *x = *y;
    *y = tmp;
}
int main()
{
    int a = 7, b = 3;

    std::cout << a << ' ' << b << '\n';
    swap(&a, &b);
    std::cout << a << ' ' << b << '\n';
}

也考虑std::swap

这是另一种不用第三个变量就可以交换两个变量值的老方法:

x = x + y;  // x now becomes 15
y = x - y;  // y becomes 10
x = x - y;  // x becomes 5

还有另一种方法,正如有人已经指出的那样,使用 xor

x = x ^ y;  // x now becomes 15 (1111)
y = x ^ y;  // y becomes 10 (1010)
x = x ^ y;  // x becomes 5 (0101)

还有一种单行方式:

x = x + y - (y = x);

你不一定需要指点。

限制 - 正如所有评论员所指出的,所有这些方法都存在限制。如果 xy 的总和超过 INT_MAX(在 32 位系统上,正数可能等于 2,147,483,647,负数可能等于 -2,147,483,648,这些方法可能会给您错误的结果) 并且您的 C 实现不会环绕有符号整数。但是,对于您的程序,如果您使用的是相对较小的数字,或者您的 C 实现也包含有符号整数,那么使用这 3 种方法中的任何一种都不应该有任何问题。但是如果您认为总和可能超过 INT_MAX,您可以使用老式的临时变量方法来交换值或使用库中提供的标准 swap 函数。

问题是您正在用 x 的值覆盖 y 的原始值,然后将该值复制回 x

你想要做的是存储x的值,将y的值复制到它,然后将存储的值移动到y

由于您正尝试使用指针执行此操作,因此您可能应该更改操作 x=y 以也使用指针。这是一个例子:

int main(int argc, char *argv[])
{
    int x=5, y=10, stash;
    int *px, *py;

    cout << "Before: x=" << x << " y=" << y;

    px = &x;
    py = &y;

    stash = *px;
    *px = *py;
    *py = stash;

    cout << "After: x=" << x << " y=" << y;
}