考虑:
#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;
}
由于数组默认作为指向其第一个元素的指针传递并且不会被复制,因此在函数中更改数组元素的值实际上会导致在函数调用者中更改数组该元素的值,这就是为什么以上代码输出
0
0
0
1
1
1
如果是这种情况,那么为什么有人需要传递如下所示的数组?
void Change(int (&arr)[3])
我知道需要括号才能使参数成为对数组的引用而不是引用数组,但是我能得到什么?
该函数声明:
void Change(int arr[3])
由编译器调整为:
void Change(int *arr)
因此,该函数对传递的数组的大小一无所知。
如果您声明该函数如下:
void Change(int ( &arr )[3])
然后在函数中,您可以使用例如标准函数来获取数组的大小std::size()
,或者获取它的第一个和最后一个迭代器,例如std::begin(arr)
and std::end(arr)
。此外,您可以通过引用模板函数来传递数组,该模板函数通过引用接受其参数,类似于传递任何容器。
另一个优点是编译器将检查是否传递了所需大小的数组,并且函数的用户不能向函数传递空指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)