如何用指针交换两个变量
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);
你不一定需要指点。
限制 - 正如所有评论员所指出的,所有这些方法都存在限制。如果 x
和 y
的总和超过 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;
}
我有一个问题,我无法创建一个用指针交换两个变量的简单程序。我这样试过:
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);
你不一定需要指点。
限制 - 正如所有评论员所指出的,所有这些方法都存在限制。如果 x
和 y
的总和超过 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;
}