因为数组不能被拷贝,所以函数不能返回数组。不过,函数可以返回数组的指针或引用。虽然从语法上来说,要想定义一个返回数组的指针或引用的函数比较繁琐,但是有一些方法可以简化这一任务,其中最直接的方法是使用类型别名:
// typedef int arrayType[10]; // 或使用下面的方式
using arrayType = int[10];
arrayType* getArrayType(int i);
其中 arrayType 是含有 10 个整数的数组的别名。因为我们无法返回数组,所以将返回类型定义成数组的指针。
声明一个返回数组指针的函数
要想在声明 getArrayType 时不使用类型别名,我们必须牢记被定义的名字后面数组的维度:
int arr[10]; // arr 是一个含有 10 个整数的数组
int *p1[10]; // p1 是一个含有 10 个指针的数组
int (*p2)[10] = &arr; // p2 是一个指针,它指向含有 10 个整数的数组
和这些声明一样,如果我们想定义一个返回数组指针的函数,则数组的维度必须跟在函数名字之后。然而,函数的形参列表也跟在函数名字后面且形参列表应该先于数组的维度。因此,返回数组指针的函数形式如下:
Type (* function(parameter_list))[dimension]
(* function(parameter_list)) 两端的括号必须存在。
下面是一个等价于使用类型别名的例子:
int (*getArrayType(int i))[10];
我们可以按照以下的顺序来逐层理解该声明的含义:
- getArrayType(int i) 表示调用 getArrayType 函数时需要一个 int 类型的实参;
- (*getArrayType(int i)) 意味着我们可以对函数调用的结果执行解引用操作;
- (*getArrayType(int i))[10] 表示解引用 getArrayType 的调用将得到一个大小是 10 的数组;
- int (*getArrayType(int i))[10]; 表示数组中的元素是 int 类型。