Function returning a pointer to an int array

2020-03-26 03:48发布

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.

2条回答
▲ chillily
2楼-- · 2020-03-26 04:17

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;
查看更多
地球回转人心会变
3楼-- · 2020-03-26 04:25

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.

查看更多
登录 后发表回答