0

我编写了一个名为 swap 的函数来交换函数中给定的两个元素。但是当我在另一个函数中使用它时,它不起作用。如何让它工作?

#include <iostream>
using namespace std;
void swap(int *a, int * b){
    int temp=*a;
    *a=*b;
    *b=temp;
}

void sum(int x, int y){
    int *a;
    a = &x;
    int *b;
    b=&x;
    swap(a,b);
    //cout << x << endl << y << endl;
}
int main(){
    int a=0, b=1;

    //swap(a,b);
    sum(a,b);
    cout << a << endl << b << endl;
    return 0;
}
4

5 回答 5

1
b=&x;

应该

b=&y;

此外,您正在交换本地副本。sum应该:

void sum(int& x, int& y)

而且,这已经存在。它被称为std::iter_swap

于 2013-04-17T12:32:24.987 回答
0

xy通过值传递给sum所以swap是在本地副本上工作,而不是来自main. 您还需要修改sum和调用交换:

void sum(int &x, int &y)
             ^       ^
{
 // other code
 swap(&x,&y);
      ^  ^
}

如果你离开你打电话给swap这样的:

swap(x,y);

你实际上会打电话给std::swap. 我将假设您将添加更多代码,sum否则名称与它的作用不一致。

于 2013-04-17T12:30:33.193 回答
0

您不是在交换中,而是在 sum 函数中,您通过值传递 x 和 y 并稍后修改和交换值的副本以解决此问题,您需要更改void sum(int x, int y){void sum(int& x, int& y){this 将导致 x 和 y 通过引用传递,因此 sum 将是能够更新它们。

于 2013-04-17T12:31:32.057 回答
0

我猜“错误”是指最后一个 cout 的输出没有像您期望的那样显示“a”和“b”。但是您将它们按值传递给“总和”。

于 2013-04-17T12:32:12.083 回答
0

我假设您只是在学习指针和引用。

您的函数swap交换两个指针的内容。请注意,您已经输入using namespace std并且 std 也有一个交换功能,所以我建议从您的源中删除它,尽管如果您传递指向 int 的指针,您的将是更接近的匹配。

您调用sum的函数显然是用词不当,因为它实际上并没有求和或添加任何内容,它试图通过调用指针版本来进行交换。

要修复您的特定错误,它必须通过引用获取其参数,并且b应该指向 y,而不是 x。

于 2013-04-17T12:34:24.793 回答