由于数组“不能拷贝”的特点,函数也无法直接返回一个数组。不过我们可以使用指针或者引用来实现返回数组的目标;通常会返回一个数组指针。
int arr[5] = {1, 2, 3, 4, 5};
int* pa[5]; // 指针数组,pa是包含5个int指针的数组
int(*ap)[5] = &arr; // 数组指针,ap是一个指针,指向长度为5的int数组
int(*fun(int x))[5]; // 函数声明,fun返回值类型为数组指针
这里对于函数 fun 的声明,我们可以进行层层解析:
- fun(int x) :函数名为 fun,形参为 int 类型的 x
- (* fun(int x)):函数返回的结果,可以执行解引用操作,说明是一个指针
- (* fun(int x))[5]:函数返回结果解引用之后是一个长度为 5 的数组,说明返回类型是数组指针
- int(* fun(int x))[5]:数组中元素类型为 int
数组指针的定义比较繁琐,为了简化定义,我们可以使用关键字 typedef
来定义一个类型的别名:
// 简化函数声明
typedef int arrayT[5]; // 类型别名,arrayT代表长度为5的int数组
arrayT* fun2(int x); // fun2的返回类型是指向arrayT的指针
C++ 11 新标准还提供了另一种简化方式,用一个 ->
符号跟在形参列表后面,再把类型单独提出来放到最后。这种方式叫做“尾置返回类型”。
auto fun3(int x) -> int(*)[5]; // 尾置返回类型
// 示例:返回一个指向包含5个整数的数组的指针
auto fn() -> int(*)[5]
{
// 使用静态数组保证在整个生命周期内存在
// 函数调用结束后仍然可以通过指针访问有效数据
static int arr[5] = {1, 2, 3, 4, 5};
return &arr;
}
要调用这个函数并接收返回的数组指针,可以使用 auto
关键字自动推导返回类型:
auto ptr = fn();
现在,ptr
就是一个指向包含5个整数的数组的指针。可以通过 (*ptr)[i]
的方式访问数组的元素。
尾置返回类型语法在一些复杂的函数返回类型中非常有用,并且可以与其他 C++ 特性(如模板)结合使用。同时也要注意释放动态分配的内存,以防止内存泄漏。
赞