函数返回数组的指针
一、概述
函数不能数组,但是可以返回数组的指针。
由于定义一个返回数组的指针的函数比较烦琐(即使定义了也很难看懂),所以我们要介绍一些简化方法。
二、使用类型别名
方法:
//way1 typedef int arrT[10]; //arrT是类型别名,表示的类型是一个数组(含有10个整数) //way2 using arrT = int[10]; //同上,arrT是含有10个整数的数组的别名
注:是数组的别名!
于是我们可以这样定义函数:
arrT* func(形参);
解读:func函数返回数组的指针,也即返回一个指向包含10个整数的数组的指针。
三、不使用类型别名
1. 数组的指针
形式:
int arr[10]; int (*p2)[10] = &arr; //p2是一个指向含有10个整数的数组的指针
注:int *p[10];,p是一个含有10个指针的数组。
2. 定义返回数组的指针的函数
形式:
int (*func(parameter_list))[10]; //若去掉括号,则返回的类型是指针的数组
四、使用尾置返回类型
任何函数的定义都能使用尾置返回,但是这种形式对于返回类型比较复杂的函数最有效。
形式:
//func函数返回的是一个指针,并且该指针指向了含有10个整数的数组 auto func(parameter_list) -> int(*)[10]; //在本该出现返回类型的地方象征性地放了一个auto
解读:我们把函数的返回类型放在了形参列表之后,故可以清楚地看到func函数返回的是一个指针。
五、使用decltype
适用于:知道函数返回的指针将指向哪个数组
用法:使用decltype关键字声明返回类型
示例:
int odd[] = {1, 3, 5, 7, 9}; int even[] = {0, 2, 4, 6, 8}; //返回一个指向包含5个整数的数组的指针 decltype(odd) *func(int i) { return (i % 2) ? &odd : &even; //返回一个指向数组的指针 }
解读:func使用关键字decltype表示它的返回类型是个指针,并且该指针所指的对象与odd的类型一致。因为odd是数组,所以func返回一个指向包含5个整数的数组的指针。
注意:decltype不负责把数组类型转换成对应的指针,所以decltype的结果是个数组,要想表示func返回指针还必须加上一个*符号。