简单的C ++交换功能

时间:2015-02-07 23:05:16

标签: 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;
}

作品

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 个答案:

答案 0 :(得分:5)

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){

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

答案 1 :(得分:1)

您的num_exchange()按值获取其参数,即它会看到原始值的副本。交换它们时,交换副本但不接触原稿。交换数组时,会传递指向数组start的指针(内置数组永远不会直接在C ++中复制)。由于指针引用原始数组而不是本地副本,因此即使退出函数,交换数组元素也会导致更改可见。

要将实际的原始对象传递给num_exchange()函数,您也可以使用指针,或者使用引用,例如:

void num_exchange(int& m, int& n) {
    // ...
}

当然,交换元素的最简单方法是使用标准或类型提供的swap()函数,尽管由于额外的using指令而使用它有点尴尬:< / p>

using std::swap;
swap(num1, num2);

答案 2 :(得分:0)

默认情况下,按值调用

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

当函数调用发生时,程序中下一条指令的地址被压入堆栈,告诉编译器在函数执行之后返回哪里,函数参数(5和6)被压入堆栈。 在函数内部,这些参数从堆栈中弹出,即m = 5,n = 6,这意味着实际参数(num1,num2)不变。 然后,在执行之后,该函数使用num1(即m)和num2(即n)的别名执行,该地址从堆栈中弹出,以便从它离开的地方继续执行。

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

CPP增加了一个名为reference的新概念。引用是赋予变量的另一个名称。

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

为什么它适用于数组??

复制整个数组是不可行的,因此数组总是通过引用传递。数组的基地址被传递给函数,因此对函数中的数组所做的任何修改都会影响实数数组。

答案 3 :(得分:0)

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

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