C++ 简单C++;交换功能
为什么如果我有一个这样的函数,交换两个数字,它不起作用[swap],(我知道我可以通过在原型中声明指针,然后在main()中传递相应变量的地址来实现这一点),但对数组有效,而不必传递指针和地址 不起作用C++ 简单C++;交换功能,c++,arrays,pointers,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 <&l
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 num_交换(int m,int n);
int main(){
int num1=5;
int num2=6;
num_交换(num1,num2);
库特
修改输入整数的副本。若要使代码正常工作,请使用
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;
}
相当于
void arr_exchange(int* x, int){
因此,这里传递一个指针,从而修改原始数据。您的num_exchange()
按值获取其参数,即它看到原始值的副本。交换它们时,副本被交换,但原始数据不被触摸。交换数组时,会传递指向数组开始的指针(内置数组永远不会在C++中直接复制)。由于指针引用的是原始数组而不是本地副本,因此即使函数退出,交换数组元素也会导致可见的更改
要将实际的原始对象传递给num\u exchange()
函数,您可以使用指针,也可以使用引用,例如:
void num_exchange(int& m, int& n) {
// ...
}
当然,交换元素的最简单方法是使用提供的标准或类型swap()
函数,尽管不可否认,由于额外的using
-指令,使用起来有点笨拙:
using std::swap;
swap(num1, num2);
默认情况下,函数是按值调用的
发生函数调用时会发生什么?
当函数调用发生时,程序中下一条指令的地址被推送到堆栈上,它告诉编译器在函数执行后返回的位置,然后函数参数(5和6)被推送到堆栈上。
在函数内部,这些参数从堆栈中弹出,即m=5,n=6。这意味着实际参数(num1,num2)不变。
然后使用别名num1(即m)和num2(即n)执行该函数。执行后,从堆栈中弹出地址,从留下的位置继续执行
在C语言中,这个问题的解决方案是传递num1、num2的地址,并使用指向函数内部的指针来指向它们
CPP添加了一个名为reference的新概念。reference是变量的另一个名称
int & n1 = num1;
int & n2 = num2;
为什么它可以与阵列一起使用???
复制整个数组是不可行的,因此数组总是通过引用传递。数组的基址传递给函数,因此在函数中对数组所做的任何修改都会影响实际数组。您正在寻找的代码需要两个指针,因为函数将复制您提供给它们的数据,所以:
void swap (int * a, int * b){
int temp = *a;
*a = *b;
*b = temp;
}
@dotman14您无法将数组传入或传出函数,因此这是数组名称将衰减为指向其第一个元素的指针的上下文之一。如果函数的签名只是“商品”,则使用括号表示法。@dotman14确实如此。但是,您可以传递对数组的引用:template void fun(int(&a)[N]){
。在这里,既不传递指针也不传递指针的引用,您可以在函数中像使用真实数组一样使用a
(在某种意义上比指针更好)。
using std::swap;
swap(num1, num2);
int & n1 = num1;
int & n2 = num2;
void swap (int * a, int * b){
int temp = *a;
*a = *b;
*b = temp;
}