返回数组指针
因为数组不能被拷贝,所以函数不能返回数组。不过,函数可以返回数组的指针或者引用。其中最直接的方法就是使用类型别名。
typedef int arrT[10]; //arrT是一个类型别名,表示含有10个整型数的类型
using arrT = int[10]; //同上的等价声明
arrT* func(int i); //函数func返回一个指针,指针指向一个含有10个整型数的数组
声明一个返回数组指针的函数
如果不使用类型别名,则数组的维度必须跟在函数名字之后。
例如:
int (*func(int i))[10]
则可以逐层理解函数意思:
* func(int i)是一个函数
* *func(int i)表示我们可以对函数返回值进行解引用,可将它替换为一个普通变量,例如a
* 将第二步替换为a,得到int a[10]为一个长度为10的整型数组,表示函数返回的值是一个解引用后为数组的类型变量,即为数组指针。
同理,一个返回函数指针的函数该怎么写呢,如下所示:
* 首先,一个函数指针可以写成int (*a)(int,int)
* 然后,将func替换成函数,如下写法
int (*func(int i))(int,int)
则表示了func函数返回的值解引用后为一个函数,即返回的是一个函数指针。
举个例子
int add(int a,int b)
{
return a+b;
}
int (*funcadd())(int,int) //一个返回函数指针的函数
{
int (*a)(int,int) = &add; //定义一个函数指针,并为其赋值
return a;
}
int main()
{
int a=1,b=2;
cout<<(*funcadd())(a,b)<<endl; //调用函数得到函数指针,解引用后再调用返回函数
return 0;
}
尾置返回类型
C++11中简化了上述的声明方法,可以使用尾置返回类型,尾置返回类型跟在形参列表后面并以一个->符号开头。为了表示函数真正返回类型在形参列表之后,我们在本应该出现返回类型的地方放置一个auto,例如:
auto func(int i) -> int(*)[10];
可以清楚地看到函数返回类型是一个数组。