Return array in a function

后端 未结 19 2324
清酒与你
清酒与你 2020-11-22 05:23

I have an array int arr[5] that is passed to a function fillarr(int arr[]):

int fillarr(int arr[])
{
    for(...);
    return arr;
         


        
相关标签:
19条回答
  • 2020-11-22 05:46

    This:

    int fillarr(int arr[])
    

    is actually treated the same as:

    int fillarr(int *arr)
    

    Now if you really want to return an array you can change that line to

    int * fillarr(int arr[]){
        // do something to arr
        return arr;
    }
    

    It's not really returning an array. you're returning a pointer to the start of the array address.

    But remember when you pass in the array, you're only passing in a pointer. So when you modify the array data, you're actually modifying the data that the pointer is pointing at. Therefore before you passed in the array, you must realise that you already have on the outside the modified result.

    e.g.

    int fillarr(int arr[]){
       array[0] = 10;
       array[1] = 5;
    }
    
    int main(int argc, char* argv[]){
       int arr[] = { 1,2,3,4,5 };
    
       // arr[0] == 1
       // arr[1] == 2 etc
       int result = fillarr(arr);
       // arr[0] == 10
       // arr[1] == 5    
       return 0;
    }
    

    I suggest you might want to consider putting a length into your fillarr function like this.

    int * fillarr(int arr[], int length)
    

    That way you can use length to fill the array to it's length no matter what it is.

    To actually use it properly. Do something like this:

    int * fillarr(int arr[], int length){
       for (int i = 0; i < length; ++i){
          // arr[i] = ? // do what you want to do here
       }
       return arr;
    }
    
    // then where you want to use it.
    int arr[5];
    int *arr2;
    
    arr2 = fillarr(arr, 5);
    
    // at this point, arr & arr2 are basically the same, just slightly
    // different types.  You can cast arr to a (char*) and it'll be the same.
    

    If all you're wanting to do is set the array to some default values, consider using the built in memset function.

    something like: memset((int*)&arr, 5, sizeof(int));

    While I'm on the topic though. You say you're using C++. Have a look at using stl vectors. Your code is likely to be more robust.

    There are lots of tutorials. Here is one that gives you an idea of how to use them. http://www.yolinux.com/TUTORIALS/LinuxTutorialC++STL.html

    0 讨论(0)
  • 2020-11-22 05:47

    In C++11, you can return 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;
    }
    
    0 讨论(0)
  • 2020-11-22 05:49

    $8.3.5/8 states-

    "Functions shall not have a return type of type array or function, although they may have a return type of type pointer or reference to such things. There shall be no arrays of functions, although there can be arrays of pointers to functions."

    int (&fn1(int (&arr)[5]))[5]{     // declare fn1 as returning refernce to array
       return arr;
    }
    
    int *fn2(int arr[]){              // declare fn2 as returning pointer to array
       return arr;
    }
    
    
    int main(){
       int buf[5];
       fn1(buf);
       fn2(buf);
    }
    
    0 讨论(0)
  • 2020-11-22 05:51

    Actually when you pass an array inside a function, the pointer to the original array is passed in the function parameter and thus the changes made to the array inside that function is actually made on the original array.

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

    Run it and you will see the changes

    0 讨论(0)
  • 2020-11-22 05:51

    Here's a full example of this kind of problem to solve

    #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;
    }
    
    0 讨论(0)
  • 2020-11-22 05:53

    Source: https://www.tutorialspoint.com/cplusplus/cpp_return_arrays_from_functions.htm

    C++ does not allow to return an entire array as an argument to a function. However, you can return a pointer to an array by specifying the array's name without an index.

    1. If you want to return a single-dimension array from a function, you would have to declare a function returning a pointer as in the following example:
    int * myFunction()    {
       .
       .
       .
    }
    
    1. C++ does not advocate to return the address of a local variable to outside of the function so you would have to define the local variable as static variable.

    Applying these rules on the current question, we can write the program as follows:

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

    The Output will be:

    p[0]=0
    p[1]=1
    p[2]=2
    p[3]=3
    p[4]=4
    
    0 讨论(0)
提交回复
热议问题