在函数中返回数组

293

我有一个数组 int arr[5],它被传递给一个函数 fillarr(int arr[])

int fillarr(int arr[])
{
    for(...);
    return arr;
}
  1. 我如何返回这个数组?
  2. 如果我返回一个指针,我将如何访问它?

66
严格来说,在这个上下文中,你不需要返回数组,因为数组是通过引用传递的,所以对于“arr”内部元素的任何更改都会在函数外部可见。 - BuggerMe
15
返回数组方便链式调用函数。 - seand
7
只要你不犯在栈上创建数组并返回指向它的指针的错误。 - detly
7
@BuggerMe说:数组并不是按引用传递的(除非你使用更加有趣的语法来请求),在代码中,数组会退化成指向第一个元素的指针并被传递给函数。函数签名中的5会被编译器丢弃。 - David Rodríguez - dribeas
7
@BuggerMe:不,其实不是。我很精确是因为我已经习惯了人们误解C ++中数组按值传递语法的语意。通过引用传递数组是这样的:void foo( int (&array)[5] );(将一个包含5个整数的数组作为引用传递)。当你通过引用传递时,在函数内部得到的是对实际类型的引用。另一方面,void foo(int array[5])在函数定义期间被编译器转换为void foo(int*)。调用foo(myarray)会导致数组衰变为指向第一个元素的指针。 - David Rodríguez - dribeas
显示剩余5条评论
21个回答

2

如上所述路径是正确的。但我认为,如果我们只返回一个函数的本地数组变量,有时它会返回垃圾值作为其元素。

为了避免这种情况,我不得不动态创建数组并进行操作。就像这样:

int* func()
{
  int* Arr = new int[100];
  return Arr;
}

int main()
{
  int* ArrResult = func();
  cout << ArrResult[0] << " " << ArrResult[1] << endl;
  return 0;
} 





1

还有什么问题吗:

int (*func())
{
    int *f = new int[10] {1,2,3};

    return f;
}

int fa[10] = { 0 };
auto func2() -> int (*) [10]
{
    return &fa;
}

除了可能是一个引用而不是一个指针,其他方面都不错 ;) - undefined

1

来源:https://www.tutorialspoint.com/cplusplus/cpp_return_arrays_from_functions.htm

C++不允许将整个数组作为参数返回给函数。但是,您可以通过指定数组名称而不使用索引来返回指向数组的指针。

  1. 如果要从函数返回单维数组,则必须声明一个返回指针的函数,如以下示例所示:
int * myFunction()    {
   .
   .
   .
}
  1. C++不赞成将局部变量的地址返回到函数外部,因此您需要将局部变量定义为静态变量。

将这些规则应用于当前问题,我们可以编写以下程序:

# include <iostream>

using namespace std;

int * fillarr( );


int main ()
{

   int *p;

   p = fillarr();

   for ( int i = 0; i < 5; i++ )
       cout << "p[" << i << "] : "<< *(p + i) << endl;

    return 0;
}


int * fillarr( )
{
    static int  arr[5];

    for (int i = 0; i < 5; ++i)
        arr[i] = i;

    return arr;
 }
输出将是:

输出将是:

p[0]=0
p[1]=1
p[2]=2
p[3]=3
p[4]=4

0
实际上,当您在函数内传递数组时,原始数组的指针会被传递到函数参数中,因此在该函数内对数组所做的更改实际上是在原始数组上进行的。
#include <iostream>

using namespace std;

int* func(int ar[])
{
    for(int i=0;i<100;i++) 
        ar[i]=i;
    int *ptr=ar;
    return ptr;
}


int main() {
    int *p;
    int y[100]={0};    
    p=func(y);

    for(int i=0;i<100;i++) 
        cout<<i<<" : "<<y[i]<<'\n';
}

运行它,你就会看到变化


1
请使用正确的英语措辞(例如使用"you'll"而不是"u'll"),并省略空洞的词语,如"buddy"。 - hellow
另外,“then actually it is passed as a reference”是错误的。变量y本身作为自身的副本传递,但因为它是一个指针,所以您将直接操作数组。请编辑您的答案。 - hellow
https://dev59.com/-G035IYBdhLWcg3wMM4GTL;DR "因此,这两种形式是相同的。" - hellow
是的,从技术上讲它是一个数组,你说得对,但复制的是指向数组的指针,而不是数组本身。 - hellow

0
一个简单而详细的例子,以便我在忘记概念并需要帮助时可以参考这里。
#include <iostream>
using namespace std;
int *ReturnArray(int arr[], int size)
{
    static int MinMax[2] = {0, 0}; // must use static, else address would be deleted after the return is reached
    MinMax[0] = arr[0];
    MinMax[1] = arr[size - 1];
    return MinMax;
}
int main()

{
    int arr[] = {1, 2, 3};
    int size = sizeof(arr) / sizeof(*arr);
    int *ans;                     // pointer to hold returned array
    ans = ReturnArray(arr, size); // only pointer can receive the return, not an array
    cout << "Min: " << ans[0] << " Max: " << ans[1];
    return 0;
}

这与提问者的问题无关。他们将一个数组作为参数。你在函数中有一个静态数组,这是非常不同的。你可以为自己的目的提出另一个问题。 - starball

0
template<typename T, size_t N>
using ARR_REF = T (&)[N];

template <typename T, size_t N>
ARR_REF<T,N> ArraySizeHelper(ARR_REF<T,N> arr);

#define arraysize(arr) sizeof(ArraySizeHelper(arr))

7
请考虑改进你的回答。仅包含代码的答案可能会被归为“非常低质量”,并有可能被删除。我们一直宣扬我们不是生产代码的工厂,而是教别人如何钓鱼的人。仅包含代码的答案只能让一个人吃一天的饭。 - user585968

0

为什么不将数组作为参数“返回”?

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[])
{
    //...
}

0
int *arr(int size)
{
    int *A;
    A = new int[size];
    for (int i = 0; i < size; i++)
    {
        A[i] = i + 1;
    }
    return A;
}
int main()
{
    int size = 5;
    int *A = arr(size);
    return 0;
}

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Nol4635

-1
我使用静态数组,这样在返回数组时就不会抛出错误,因为你正在返回本地变量的地址... 现在你可以通过将其设置为静态变量来发送任何在函数中创建的本地变量...因为它的工作方式就像全局变量一样...
#include<iostream>
using namespace std;

char *func(int n)
{
   // char a[26]; /*if we use this then an error will occur because you are 
                        //  returning address of a local variable*/
    static char a[26];
    char temp='A'; 
    for(int i=0;i<n;i++)
    {
     a[i]=temp;temp++;
    }
    return a;
}
int main()
{
    int n=26;
    char *p=func(n);
    for(int i=0;i<n;i++)
     cout<<*(p+i)<<" ";

   //or you can also print like this
  
    for(int i=0;i<n;i++)
     cout<<p[i]<<" ";    

}

-1

这是一个完整的例子,需要解决这种问题

#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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接