Fra*_*rme 17 c++ pass-by-reference pass-by-value function-declaration
考虑:
#include <iostream>
using namespace std;
void Change(int arr[3]) {
for (int i = 0; i < 3; i++) {
arr[i] = 1;
}
}
int Test() {
int arr[3] = { 0, 0, 0 };
for (int i = 0; i < 3; i++) {
cout << arr[i] << endl;
}
Change(arr);
for (int i = 0; i < 3; i++) {
cout << arr[i] << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
由于数组默认作为指向其第一个元素的指针传递并且不会被复制,因此在函数中更改数组元素的值实际上会导致在函数调用者中更改数组该元素的值,这就是为什么以上代码输出
#include <iostream>
using namespace std;
void Change(int arr[3]) {
for (int i = 0; i < 3; i++) {
arr[i] = 1;
}
}
int Test() {
int arr[3] = { 0, 0, 0 };
for (int i = 0; i < 3; i++) {
cout << arr[i] << endl;
}
Change(arr);
for (int i = 0; i < 3; i++) {
cout << arr[i] << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果是这种情况,那么为什么有人需要传递如下所示的数组?
void Change(int (&arr)[3])
Run Code Online (Sandbox Code Playgroud)
我知道需要括号才能使参数成为对数组的引用而不是引用数组,但是我能得到什么?
Vla*_*cow 43
该函数声明:
void Change(int arr[3])
Run Code Online (Sandbox Code Playgroud)
由编译器调整为:
void Change(int *arr)
Run Code Online (Sandbox Code Playgroud)
因此,该函数对传递的数组的大小一无所知。
如果您声明该函数如下:
void Change(int ( &arr )[3])
Run Code Online (Sandbox Code Playgroud)
然后在函数中,您可以使用例如标准函数 来获取数组的大小std::size(),或者获取其第一个和最后一个迭代器,例如std::begin(arr)和std::end(arr)。此外,您可以通过引用模板函数来传递数组,该模板函数通过引用接受其参数,类似于传递任何容器。
另一个优点是编译器将检查是否传递了所需大小的数组,并且函数的用户不能向函数传递空指针。