我有一个数组int arr[5],传递给一个函数fillarr(int arr[]):
int fillarr(int arr[])
{
for(...);
return arr;
}
我如何返回那个数组? 我将如何使用它,比如我返回了一个指针我将如何访问它?
我有一个数组int arr[5],传递给一个函数fillarr(int arr[]):
int fillarr(int arr[])
{
for(...);
return arr;
}
我如何返回那个数组? 我将如何使用它,比如我返回了一个指针我将如何访问它?
当前回答
为什么不把数组作为参数“返回”呢?
fillarr(int source[], size_t dimSource, int dest[], size_t dimDest)
{
if (dimSource <= dimDest)
{
for (size_t i = 0; i < dimSource; i++)
{
//some stuff...
}
}
else
{
//some stuff..
}
}
或者用更简单的方式(但你必须知道尺寸…):
fillarr(int source[], int dest[])
{
//...
}
其他回答
在c++ 11中,可以返回std::array。
#include <array>
using namespace std;
array<int, 5> fillarr(int arr[])
{
array<int, 5> arr2;
for(int i=0; i<5; ++i) {
arr2[i]=arr[i]*2;
}
return arr2;
}
int *fillarr(int arr[])
你仍然可以使用结果like
int *returned_array = fillarr(some_other_array);
if(returned_array[0] == 3)
do_important_cool_stuff();
在这种情况下,数组变量arr实际上也可以通过隐式转换被视为指向内存中数组块开头的指针。你正在使用的语法:
int fillarr(int arr[])
有点像语法糖。你真的可以用这个替换它,它仍然可以工作:
int fillarr(int* arr)
所以在同样的意义上,你想从你的函数返回的实际上是一个指向数组中第一个元素的指针:
int* fillarr(int arr[])
你仍然可以像使用普通数组一样使用它:
int main()
{
int y[10];
int *a = fillarr(y);
cout << a[0] << endl;
}
这里有一个完整的例子来解决这类问题
#include <bits/stdc++.h>
using namespace std;
int* solve(int brr[],int n)
{
sort(brr,brr+n);
return brr;
}
int main()
{
int n;
cin>>n;
int arr[n];
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
int *a=solve(arr,n);
for(int i=0;i<n;i++)
{
cout<<a[i]<<endl;
}
return 0;
}
c++函数不能按值返回C风格的数组。最接近的方法是返回一个指针。此外,参数列表中的数组类型被简单地转换为指针。
int *fillarr( int arr[] ) { // arr "decays" to type int *
return arr;
}
你可以通过对参数和返回使用数组引用来改进它,这可以防止衰减:
int ( &fillarr( int (&arr)[5] ) )[5] { // no decay; argument must be size 5
return arr;
}
在Boost或c++ 11中,引用传递只是可选的,语法也不那么令人费解:
array< int, 5 > &fillarr( array< int, 5 > &arr ) {
return arr; // "array" being boost::array or std::array
}
数组模板只是生成一个包含c风格数组的结构,因此可以应用面向对象的语义,同时保留数组原始的简单性。