Function returning a pointer to an int array

前端 未结 2 1981
长情又很酷
长情又很酷 2021-01-14 00:24

I am learning C++ from Primer 5th edition and I am at Returning a Pointer to an Array. The declaration of this function is:

 int (*func(int i))[10]; 


        
相关标签:
2条回答
  • 2021-01-14 01:09

    int(*)[10] is a pointer to an array of 10 ints. int* is a pointer to int. These are different types.

    However, an array decays to a pointer to its first element, so you can do:

    int a[10];
    int(*p)[10] = &a;
    int* q = a; // decay of int[10] to int*
    

    But not:

    q = p;
    p = q;
    
    0 讨论(0)
  • 2021-01-14 01:19

    Read: What does sizeof(&array) return? to understand diffrence between array name and address of array.

    Q1 I want to know the difference between:  

    In your code:

      int *func(){
        static int a[]={1,2,3};
        return a;
      }
    

    you are returning address of first element. Actually type of a is int[3] that decays into int*. Important is
    You stores address into int* p and can assess elements of array as p[i].

    Whereas if your function would be int int (*func())[3] then you return &a, and assign to int(*p)[3] and can access (*p)[i].
    Note: type of &a is int(*)[3].

    Q2 How i can make this function call work, because in the book, there isn't any concrete example.

    like:

    int (*func())[3]{
        static int a[]={1,2,3};
        return &a;
    }
    

    And main():

    int main(){ 
     int i=0;    
     int(*p)[3] = func();
     for(i=0; i<3; i++)
       printf(" %d\n", (*p)[i]);
     return 0;
    }
    

    You can check second version of code working id Ideone

    Q1 I want to know the difference between:  

    As you are interested to know diffrence between two so now compare two different declarations of p in two versions of code:

    1) : int* p; and we access array elements as p[i] that is equals to *(p + i).

    2) : int (*p)[i] and we access array elements as (*p)[i] that is equals to *((*p) + i) or just = *(*p + i). ( I added () around *p to access array element because precedence of [] operator is higher then * So simple *p[i] means defense to the array elements).

    Edit:

    An addition information other then return type:

    In both kind of functions we returns address that is of a static variable (array), and a static object life is till program not terminates. So access the array outsize func() is not a problem.

    Consider if you returns address of simple array (or variable) that is not static (and dynamically allocated) then it introduce as Undefined behavior in your code that can crash.

    0 讨论(0)
提交回复
热议问题