简单的 C++ 交换函数
Simple C++ swap function
为什么如果我有这样的函数,交换两个数字,它不起作用[交换],(我知道我可以通过在原型中声明指针,然后传递地址来做到这一点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;
}
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){
所以这里传递了一个指针,从而修改了原始数据。
您的 num_exchange()
按值获取参数,即它看到原始值的副本。当你交换它们时,副本被交换但原件没有被触及。当您交换数组时,而是传递一个指向数组开始的指针(在 C++ 中永远不会直接复制内置数组)。由于指针引用原始数组而不是本地副本,因此即使退出函数,交换数组元素也会导致可见的更改。
要将实际的原始对象传递给您的 num_exchange()
函数,您也可以使用指针,或者使用引用,例如:
void num_exchange(int& m, int& n) {
// ...
}
当然,交换元素的最简单方法是使用提供的标准或类型 swap()
函数,尽管由于额外的 using
指令,使用起来有点尴尬:
using std::swap;
swap(num1, num2);
函数默认按值调用。
发生函数调用时会发生什么???
当函数调用发生时,程序中下一条指令的地址被压入堆栈,这告诉编译器在函数执行后 return 将函数参数(5 和 6)压入堆栈的位置。
在函数内部,这些参数从堆栈中弹出,即 m=5,n=6 这意味着实际参数 (num1,num2) 没有改变。
然后函数以 num1(即 m) 和 num2(即 n) 的别名执行,执行后地址被弹出堆栈,从它留下的地方继续执行。
在C中,解决这个问题的方法是传递num1,num2的地址,并使用指向内部函数的指针来指向它们。
CPP 添加了新概念 reference.A 引用是给变量的另一个名称。
int & n1 = num1;
int & n2 = num2;
为什么它适用于数组?
复制整个数组是不可行的,因此数组总是通过引用传递。数组的基地址被传递给函数,因此函数中对数组所做的任何修改都会影响真正的数组。
您正在寻找的代码需要两个指针,因为该函数将复制您提供给它们的数据,因此:
void swap (int * a, int * b){
int temp = *a;
*a = *b;
*b = temp;
}
为什么如果我有这样的函数,交换两个数字,它不起作用[交换],(我知道我可以通过在原型中声明指针,然后传递地址来做到这一点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;
}
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){
所以这里传递了一个指针,从而修改了原始数据。
您的 num_exchange()
按值获取参数,即它看到原始值的副本。当你交换它们时,副本被交换但原件没有被触及。当您交换数组时,而是传递一个指向数组开始的指针(在 C++ 中永远不会直接复制内置数组)。由于指针引用原始数组而不是本地副本,因此即使退出函数,交换数组元素也会导致可见的更改。
要将实际的原始对象传递给您的 num_exchange()
函数,您也可以使用指针,或者使用引用,例如:
void num_exchange(int& m, int& n) {
// ...
}
当然,交换元素的最简单方法是使用提供的标准或类型 swap()
函数,尽管由于额外的 using
指令,使用起来有点尴尬:
using std::swap;
swap(num1, num2);
函数默认按值调用。
发生函数调用时会发生什么???
当函数调用发生时,程序中下一条指令的地址被压入堆栈,这告诉编译器在函数执行后 return 将函数参数(5 和 6)压入堆栈的位置。 在函数内部,这些参数从堆栈中弹出,即 m=5,n=6 这意味着实际参数 (num1,num2) 没有改变。 然后函数以 num1(即 m) 和 num2(即 n) 的别名执行,执行后地址被弹出堆栈,从它留下的地方继续执行。
在C中,解决这个问题的方法是传递num1,num2的地址,并使用指向内部函数的指针来指向它们。
CPP 添加了新概念 reference.A 引用是给变量的另一个名称。
int & n1 = num1;
int & n2 = num2;
为什么它适用于数组?
复制整个数组是不可行的,因此数组总是通过引用传递。数组的基地址被传递给函数,因此函数中对数组所做的任何修改都会影响真正的数组。
您正在寻找的代码需要两个指针,因为该函数将复制您提供给它们的数据,因此:
void swap (int * a, int * b){
int temp = *a;
*a = *b;
*b = temp;
}