简单的C++ swap函数

5

为什么我有一个像这样交换两个数字的函数时,它不起作用[swap],(我知道通过在原型中声明指针,然后在主函数中传递相应变量的地址可以实现,但是看到对数组时不需要传递指针或地址就可以工作)。

不起作用

void num_exchange(int m, int n);

int main(){

int num1 = 5;
int num2 = 6;

num_exchange(num1 , num2 );

cout << "num1 =" << num1 << endl;
cout << "num2 =" << num2 << endl;

return 0;
}

void num_exchange(int m, int n){
int temp;
temp = m;
m = n;
n = temp;
}

工作

void arr_exchange(int [], int);

int main(){


int n[7] = { 0, 0, 0, 0, 0, 0, 0 };

arr_exchange(n, 7);
for (int i = 0; i < 7; i++)
    cout << n[i] << " ";

return 0;
}

void arr_exchange(int x[], int){
for (int i = 0; i < 7; i++)
    x[i] = 1;
}
4个回答

6
void num_exchange(int m, int n){
int temp;
temp = m;
m = n;
n = temp;
}

修改输入整数的副本。为使您的代码奏效,请使用。
void num_exchange(int& m, int& n){
int temp;
temp = m;
m = n;
n = temp;
}

注意第一行中的&,它表示传递引用。通常情况下,使用std::swap来交换东西。

void arr_exchange(int x[], int){
for (int i = 0; i < 7; i++)
    x[i] = 1;
}

之所以能在C++中正常运作,是因为

void arr_exchange(int x[], int){

等同于

void arr_exchange(int* x, int){

所以这里传递了一个指针,因此原始数据被修改。

2
@dotman14 你不能在函数内或外传递数组,因此这是数组名称会衰变为指向其第一个元素的指针的上下文之一。如果函数签名只是一个“商品”,那么方括号表示法就是如此。 - Quentin
2
@dotman14 的确。但是你可以传递数组的引用:template <std::size_t N> void fun (int (&a)[N]) {。在这里,既不传递指针也不传递指针的引用,你可以在函数中像使用真正的数组一样使用 a(在某种意义上比指针更好)。 - Baum mit Augen

1
您的 num_exchange()按值传递其参数,即它看到原始值的副本。当您交换它们时,副本被交换,但原始副本并未被触及。当您交换数组时,会传递指向数组开头的指针(内置数组在C++中永远不会直接复制)。由于指针引用原始数组而不是本地副本,因此交换数组元素会导致在函数退出时仍可见的更改。
要将实际的原始对象传递给您的 num_exchange()函数,您可以使用指针或引用,例如:
void num_exchange(int& m, int& n) {
    // ...
}

当然,交换元素最简单的方法是使用标准或类型提供的swap()函数,尽管由于额外的using指令而有些棘手。
using std::swap;
swap(num1, num2);

0

函数默认是按值调用的。

当函数调用发生时会发生什么?

当函数调用发生时,程序中下一条指令的地址被推入堆栈,告诉编译器在函数执行后返回的位置,然后将函数参数(5和6)推入堆栈。在函数内部,这些参数从堆栈中弹出,即m=5,n=6,这意味着实际参数(num1,num2)未被更改。然后使用num1(即m)和num2(即n)的别名执行函数,执行完成后将地址从堆栈中弹出以继续从离开的地方执行。

在C语言中,解决此问题的方法是传递num1、num2的地址,并在函数内部使用指针来指向它们。

C++引入了一个称为引用的新概念。引用是给变量赋予的另一个名称。

int & n1 = num1;
int & n2 = num2;

为什么它适用于数组??

复制整个数组是不可行的,因此数组始终是按引用传递的。数组的基地址被传递到函数中,因此在函数中对数组所做的任何修改都会影响实际的数组。


0

你所寻找的代码需要两个指针,因为该函数将复制你提供给它们的数据:

void swap (int * a, int * b){
    int temp = *a;
    *a = *b;
    *b = temp;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接