因为数组不能被拷贝,所以函数不能返回数组。不过,函数可以返回数组的指针或引用。虽然从语法上来说,要想定义一个返回数组的指针或引用的函数比较繁琐,但是有一些方法可以简化这一任务,其中最直接打方法是使用类型别名
-
typedef int arrT[10];//arrT是一个类型别名,它表示的类型是含有10个整数的数组
-
//using arrT = int[10];//arrT的等价声明
-
arrT* func(int i);//func返回一个指向含有10个整数的数组指针
其中arrT是含有10个整数的数组别名。因为我们无法返回数组,所以将返回类型定义成数组的指针。因此,func函数接受一个int实参,返回一个指向包含10个整数的数组的指针。
声明一个返回数组指针的函数
要想在声明func时不使用类型别名,我们必须牢记被定义的名字后面数组的维度:
-
int arr[10];//arr是一个含有10个整数的数组
-
int *p1[10];//p1是一个含有10个指针的数组
-
int (*p2)[10] = &arr;//p2是一个指针,它指向含有10个整数的数组
和这些声明一样,如果我们想定义一个返回数组的指针函数,则数组的维度必须跟在函数名字之后。然而,函数的形参列表也跟在函数名字后面而且形参列表应该先于数组的维度。因此,返回数组指针的函数形式如下所示:
Type (*function(parameter_list))[dimension]
类似于其他数组的声明,Type表示的类型,dimension表示数组的大小。
(*function(parameter_list)) 两端的括号必须存在,就像定义p2是两端有括号一样。如果没有括号,函数的返回类型将是指针的数组。
举个具体点的例子,下面这个func函数的声明没有使用类型别名:
下面将按照以下顺序来逐层理解该声明含义:
func(int i)表示调用func函数时需要一个int类型的实参。
(*func(int i))意味着我们可以对函数调用的结果执行解引用操作
(*func(int i))[10]表示解引用func的调用将得到一个大小是10的数组
int (*func(int i))[10]表示数组中的元素是int类型
使用尾置返回类型
在C++11新标准中还有一种可以简化上述func声明的方法,就是使用尾置返回类型。任何函数的定义都能使用尾置返回,但是这种形式对于返回类型比较复杂的函数最有效,比如返回类型是数组的指针或数组的引用。尾置返回类型跟在形参列表后面并以一个->符号返回。为了表示函数真正的返回类型跟在形参列表之后,我们在本应该出现返回类型的地方放置一个auto:
-
//func接受一个int类型的实参,返回一个指针,该指针指向含有10个整数的数组
-
auto func(int i) -> int(*)[10];
因为我们把函数的返回值的类型放在形参列表之后,所以可以清楚地看到func函数返回的是一个指针,并且该指针指向了含有10个整数的数组
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31416433/viewspace-2130354/
,如需转载,请注明出处,否则将追究法律责任。