Function returning a pointer to an int array

c, c++, function-pointers, pointers

Solution

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.

Problem

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.

Original source

Related problems