简单的C++交换功能

hel*_*llo 3 c++ arrays pointers

为什么如果我有这样的函数,交换两个数字,它不起作用[swap],(我知道我可以通过在原型中声明指针,然后传递相应变量的地址来实现main()),但适用于数组,无需传递指针和地址.

不行

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;
}
Run Code Online (Sandbox Code Playgroud)

作品

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;
}
Run Code Online (Sandbox Code Playgroud)

Bau*_*gen 5

void num_exchange(int m, int n){
int temp;
temp = m;
m = n;
n = temp;
}
Run Code Online (Sandbox Code Playgroud)

修改输入整数的副本.使您的代码可以使用

void num_exchange(int& m, int& n){
int temp;
temp = m;
m = n;
n = temp;
}
Run Code Online (Sandbox Code Playgroud)

相反(请注意&第一行).这称为通过引用传递.一般来说,std::swap用来交换东西.

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

因为在C++中有效

void arr_exchange(int x[], int){
Run Code Online (Sandbox Code Playgroud)

相当于

void arr_exchange(int* x, int){
Run Code Online (Sandbox Code Playgroud)

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

  • @ dotman14您无法将数组传入或传出函数,因此它是数组名称将衰减为指向其第一个元素的指针的上下文之一.如果函数的签名只是一个"商品",则括号表示法. (2认同)
  • @dotman14 确实如此。但是,您可以传递对数组的引用:`template &lt;std::size_t N&gt; void fun (int (&amp;a)[N]) {`。在这里,既不传递指针也不传递指针的引用,您可以在函数中像真正的数组一样使用 `a`(在某种意义上比指针更好)。 (2认同)