C++ 如何用指针交换两个变量

C++ 如何用指针交换两个变量,c++,pointers,swap,C++,Pointers,Swap,我有一个问题,我不能创建一个简单的程序来用指针交换两个变量。我试着这样做: int main() { int x=5, y=10; int *p=nullptr; p=&x; y=*p; x=y; cout<<x<<" "<<y; } intmain(){ int x=5,y=10; int*p=nullptr; p=&x; y=*p; x=y; cout无效交换(int*x,int*y) { int tmp; tmp=*x; *x=*y; *

我有一个问题,我不能创建一个简单的程序来用指针交换两个变量。我试着这样做:

int main() {

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

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

cout<<x<<" "<<y;
}
intmain(){
int x=5,y=10;
int*p=nullptr;
p=&x;
y=*p;
x=y;
cout
无效交换(int*x,int*y)
{
int tmp;
tmp=*x;
*x=*y;
*y=tmp;
}
int main()
{
INTA=7,b=3;

std::cout这是另一种不用第三个变量交换两个变量值的好方法:

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\u MAX
(在32位系统上,正侧可能等于2147483647,负侧可能等于-2147483648)而且您的C实现并不围绕有符号整数。但是,对于您的程序,如果您使用的是相对较小的数字,或者您的C实现也围绕有符号整数,那么使用这三种方法中的任何一种都不会有任何问题。但是如果您认为总和可能超过
INT\u MAX
,则可以使用旧的fas使用临时变量方法交换值或使用库中提供的标准
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;
}
intmain(intargc,char*argv[])
{
int x=5,y=10,隐藏;
int*px,*py;

cout
std::swap(x,y);
如果您想手动执行,请使用
int temp;
。指针在这里对您没有帮助。提示:您需要另一个int。您也可以使用xorunless来执行此操作。您的签名int溢出…这是UB.减1表示溢出vulnerabilities@stackptr,这只是为了让OP继续进行基本的操作。看看我发布的备选答案。三可怕代码的例子。所有这些都有严重的缺点。这些黑客不属于任何人的“基本”概念。“老式的临时变量方法”是实现这一点的正确方法。请注意,对
int
变量范围的唯一保证是它们可以保存[-32727,32767]中的值是的,你可以写一长串的限定词来解释这个黑客代码什么时候能给出正确的答案,什么时候不能给出正确的答案,但是这太多的工作和太多的风险了。简单的“老式”方法很好用,根本不需要这些东西。工程是解决问题,而不是制造问题。
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;
}