4

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]; 

and it's expected to return a pointer to an array.

I wrote code that does this:

#include <iostream>
#include <string>
using namespace std;

int *func(){
  static int a[]={1,2,3};
  return a;
}
int main (){
  int *p=func();
  for(int i=0;i!=3;++i){
    cout<<*(p+i);
  }
}

And it is working. But I want to know the difference between what I made here and

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

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

13
  • 1
    I think you are confuse between array name = a , int*and address of array &a, int(*)[5] read lined answer may help you. Commented Jul 26, 2013 at 13:11
  • 4
    @jrok: This question seems better than the other, I don't know why the votes to close, as it is well formed (well, on the average of the quality of the site I'd say) Commented Jul 26, 2013 at 13:11
  • 1
    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 (*func(int i))[3] then you return &a and assign to int(*p)[3] and can access (*p)[i] Commented Jul 26, 2013 at 13:14
  • 1
    @alin let me know does my answer helps, ask your doubt to my answer.. feel free to ask .. Commented Jul 26, 2013 at 14:02
  • 1
    @alin (1) comment to answer instead to your question (else it will confuse other). (2) I couldn't understand your question --but Understand if you declares your array simply int a[] = {1, 3, 3} instead of using static keyword then is becomes buggy code. because life & scope of local array is till function not returns. Commented Jul 26, 2013 at 14:51

2 Answers 2

3

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.

Sign up to request clarification or add additional context in comments.

5 Comments

Thank you very much for your answer, it helped me and i understan in finally, but i have one more question, how i escape by static int a[]{}, so, I want to return a array not from fuction, by exemple from int main(), or anywere
@alin see main() is quit different function then other its declaration is predefined you can't make a main() that returns pointer to array. Its return type has to be int only.
Sorry @ Grijesh chauhan, but when I "discover" this function (accept an answer) I give accept at all, and first was your answer, and when i accept any answer your answer was unaccepted. Sorry , i accept your answer.
@alin Ok no problem, You can vote all, but can accept only one that the reason ?I give a like to you.
@GrijeshChauhan i was reading your answer then i wanted to try your second and third code but i could not compile it (it tells me that Returning 'int[3] *' from a function/method/block returning 'int[3]': Array is not assignabel )
2

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;

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.