假设我有一个数组
int arr[] = {...};
arr = function(arr);
Run Code Online (Sandbox Code Playgroud)
我有这个功能
int& function(int arr[])
{
//rest of the code
return arr;
}
Run Code Online (Sandbox Code Playgroud)
我在这里犯了什么错误?
int& function(int arr[])
Run Code Online (Sandbox Code Playgroud)
在这个函数中,arr是一个指针,并且无法再将其转回数组.它是一样的
int& function(int* arr)
Run Code Online (Sandbox Code Playgroud)
int arr[] = {...};
arr = function(arr);
Run Code Online (Sandbox Code Playgroud)
假设函数设法返回对数组的引用,这仍然无效.您无法分配给阵列.最好你可以将结果绑定到"X ints数组的引用"(使用typedef,因为语法会变得非常难看):
typedef int ten_ints[10];
ten_ints& foo(ten_ints& arr)
{
//..
return arr;
}
int main()
{
int arr[10];
ten_ints& arr_ref = foo(arr);
}
Run Code Online (Sandbox Code Playgroud)
但是,完全不清楚问题中的代码应该达到什么目的.您在函数中对数组所做的任何更改都将对调用者可见,因此没有理由尝试返回数组或将其分配回原始数组.
如果你想要一个固定大小的数组,你可以分配和传递值(复制内容),那就是std::tr1::array
(或boost::array
).std::vector
也是一个选项,但这是一个动态数组,所以不是一个完全相同的.
正如其他人所说,有更好的选择,如STL容器,最有趣的问题是为什么你需要将数组返回到已经在范围内的函数.
话虽这么说,你不能通过值传递或返回数组,并且需要通过使用指针或对它的引用来避免数组衰减到指针(参见此处):
int (&f(int (&arr)[3]))[3]
{
return arr;
}
Run Code Online (Sandbox Code Playgroud)
如果您不想对大小进行硬编码,可以使用模板函数:
template<size_t n>
int (&f(int (&arr)[n]))[n]
{
return arr;
}
Run Code Online (Sandbox Code Playgroud)