函数返回数组指针的方法,写了三种:
1.声明一个返回数组指针的函数
按我自己的理解应该是int*[x] func(int i); ←其实这是错误的想法,编程不是我们自己想象的那样。
//Type (*function (parameter_list))[dimension]
int (*func(int i)) [10];
- func(int i)表示调用func函数所需要一个int类型的实参。
- (*func(int i))意味着我们可以对函数调用的结果执行解引操作。
//意思就是函数调用的结果的是个指针。 - (*func(int i)) [10]表示解引用func的调用将得到一个大小是10的数组。
- int (*func(int i)) [10]表示数组中的元素是int类型。
这和下面的定义比较像
int arr [10]; //arr是一个含有10个整数的数组
int *p1[10]; //p1是一个含有10个指针的数组
int (*p2) [10]=&arr; //p2是一个指针,它指向含有10个整数的数组
2.使用尾值返回类型
为了表示函数真正的返回类型跟在形参列表之后,我们在本应该出现返回类型的地方放置一个auto。
//func接受一个int类型的实参,返回一个指针,该指针指向含有10个整数的数组
auto func(int i)->int(*) [10];
//int(*) [10] 和数组的指针读法一样,先读小括号里面:是个指针类型,
//再读右边:指针指向一个含有10个元素的数组,
//最后读左边:元素的类型是int型。
因为我们把函数的返回类型放在了形参列表之后,所以可以清楚地看到func函数返回的是一个指针,并且该指针指向了含有10个整数的数组。
3.使用decltype
还有一种情况,如果我们知道函数返回的指针将指向哪个数组,就可以使用decltype关键字声明返回类型。
int odd[]={1,3,5,7,9};
int even[]={0,2,4,6,8};
//返回一个指针,该指针指向含有5个整数的数组
decltype(odd) *arrPtr(int i){
return (i%2)?&odd:&even;
}
arrPtr使用关键字decltype表示它的返回类型是个指针,并且该指针所指的对象与odd的类型一致。 因为odd是数组,所以arrPtr返回一个指向含有5个整数的数组的指针。
有一个地方需要注意:decltype并不负责把数组类型转换成对应的指针,所以decltype的结果是个数组,要想表示arrPtr返回指针还必须在函数声明时加一个*符号。