Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 简单C++;交换功能_C++_Arrays_Pointers - Fatal编程技术网

C++ 简单C++;交换功能

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

为什么如果我有一个这样的函数,交换两个数字,它不起作用[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 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;
}