假设我有一个数组
int arr[] = {...};
arr = function(arr);
我的功能为
int& function(int arr[])
{
//rest of the code
return arr;
}
我在这里犯了什么错误?
答案 0 :(得分:7)
int& function(int arr[])
在这个函数中,arr是一个指针,并且无法再将其转回数组。它与
相同int& function(int* arr)
int arr[] = {...};
arr = function(arr);
假设函数设法返回对数组的引用,这仍然不起作用。您无法分配给数组。最好你可以将结果绑定到“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);
}
然而,完全不清楚你的问题中的代码应该达到什么目的。您对函数中的数组所做的任何更改都将对调用者可见,因此没有理由尝试返回数组或将其分配回原始数组。
如果你想要一个固定大小的数组,你可以分配和传递值(复制内容),那就是std::tr1::array
(或boost::array
)。 std::vector
也是一个选项,但这是一个动态数组,因此不是完全等价的。
答案 1 :(得分:6)
正如其他人所说,有更好的选择,如STL容器,最有趣的问题是为什么你需要将数组返回到已经在范围内的函数。
话虽如此,你不能按值传递或返回数组,并且需要通过使用指针或对它的引用来避免数组衰减到指针(参见例如here):
int (&f(int (&arr)[3]))[3]
{
return arr;
}
如果您不想硬编码大小,可以使用模板功能:
template<size_t n>
int (&f(int (&arr)[n]))[n]
{
return arr;
}
答案 2 :(得分:4)
数组传递和返回的语义可能非常混乱。改为使用std :: vector。
答案 3 :(得分:3)
您将返回对int的引用,而不是对数组的引用。
你想:
(int*)& function(int arr[])
{
/// rest of the code
return arr;
}
那就像其他人已经说过的那样,这不是一种好的做法。
答案 4 :(得分:3)
以下作品,似乎并不凌乱或不易理解!
int* returnarray(int a[])
{
for (unsigned int i = 0; i < 3; i++)
{
a[i] *= 2;
}
return a;
}
int main(int argc, char* argv[])
{
int arr[3] = {1,2,3};
int* p = returnarray(arr);
for (unsigned int i = 0; i < 3; i++)
{
cout << "p[" << i << "] = " << p[i] << endl;
}
cin.get();
return 0;
}
答案 5 :(得分:1)
答案 6 :(得分:1)
我认为最好的办法是将其作为指向数组的指针返回。这是一个例子:
{
...
int newLength = 0;
int* arr2 = ChangeArray(arr, length, newLength);
...
delete[] arr2;
}
int* ChangeArray(int arr[], int length, int& newLength)
{
// reversing the number - just an example
int* newArr = new int[length];
for(int i = 0; i < length; i++)
{
newArr[i] = arr[length-i-1];
newLength++;
}
return newArr;
}
答案 7 :(得分:0)
嗯,arr与int*
兼容,而非int&
。您的代码将无法编译。也许你想要return arr[0]
?
答案 8 :(得分:0)
您无法在C ++中将数组分配给另一个数组。考虑使用STL向量:http://www.cplusplus.com/reference/stl/vector/
答案 9 :(得分:0)
像这样使用std :: vector。
std::vector<int> function(const std::vector<int>& arr)
{
return arr;
}
像
这样的数组int arr[] = {...};
从函数返回没有用,因为它无法复制自身。
答案 10 :(得分:0)
如果没有必要,请不要使用它。你可以传递一个数组的引用,例如:
void foo(std::vector<int> &v) {
for (int i = 0; i < 10; ++ i) {
v.push_back(i);
}
}
如果您使用:
std::vector<int> foo() {
std::vector<int> v;
for (int i = 0; i < 10; ++ i)
v.push_back(i);
return v;
}
将会有一个容器的复制过程,成本很高。
仅供参考:NRVO可能会消除成本