首页 > 代码库 > 声明返回数组指针的函数

声明返回数组指针的函数

时间:2014.05.18

地点:基地

------------------------------------------------------------------------

一、基本知识

  常识:数组不能被拷贝,函数不能返回数组,只能返回数组的指针或者引用。

typedet int arr[10]; //arr是类型别名,表示的类型含有10个整数的数组
上述语句等效于

using arr=int[10]

在来复习几个基础知识

int arr[10];   //arr是一个含有10个整数的数组
int *p1[10];  //p1和[ ]的结合度要高,所以p1首先是一个10个大小的数组,即这里的p是一个数组名,其次是与*结合,表数组中每个元素都是整型指针
int (*p)[10]=&arr;  //由于括号p首先与*结合,即p是一个指针,然后才与[ ]结合,说明p指针指向大小为10的一个数组,且p指针初始化,p是一个数组指针

------------------------------------------------------------------------

二、声明返回数组的指针

  联系一般的赋值语句:

int a=b;
int a=fun(c);
即发生函数调用时这里的func(c)和b等同的地位,于是,当函数返回数组指针时我们也要等同于 int (*p)[10]的形式,按照这种法则,返回函数指针的函数形式如下:

Type(*function(parameter_list))[dimension]
和函数指针 int(*p)[10]对应,(*function(parameter_list))是相当于(*int p),后面在跟上返回数组指针所指向的数组的维度。
一个例子:

int (*func(int i))[10];
func(int i)  意味着调用func函数时需要一个int类型的实参

(*func(int)) 意味着对函数调用的结果是一个指针

(*func(int i))[10] 意味着对函数调用结果的指针是一个指向数组,数组大小为10

int (*func(int))[10] 意味着对函数调用结果的指针指向的数组中,数组元素都是整型的。

但正如前面所说,
若果我们使用类型别名,声明一个返回数组指针的函数的函数就看起来要优雅多了

using arrT=int[10]; //arr是大小为10的数组的一个别名,即相当于把int[10]看成是一种类型,该类型是一个整型数组,大小为10
有了这,现在声明一个返回数组指针的函数时就是声明一个返回这样类型的指针了,于是很优雅的如下:

arrT* func(int i);

------------------------------------------------------------------------

三、使用尾置返回类型

  在上面方式中,个人非常喜欢用using语句,它非常直观简明。然而在声明返回类型时,我们还有一种更简洁的办法,那就是使用尾置返回类型。任何函数的定义都能使用尾置返回,它在形参列表后以一个 -> 符号开头,为表示函数真正的返回类型在形参列表之后,我们在最前放置一个auto,比如:

auto func(int i)->int(*)[10];  //func接受一个int类型的实参,返回一个指针,指针指向10个整数的数组
于是现在就可以清楚地看到func函数返回的是一个指针,该指针指向10个整数的数组。

------------------------------------------------------------------------

四、使用decltype

  若果知道函数返回的指针指向哪个数组还可以使用decltype关键字声明返回类型,比如一个典型的例子:

#include<iostream>
int odd[] = { 1, 3, 5, 7, 9 };
int even[] = { 0, 2, 4, 6, 8 };
decltype(odd)* func(int i)
{
	return (i & 1) ? &odd : &even;
}
int main()
{
	
	std::cout << (*func(1))[2]<< std::endl;
	std::cout << (*func(2))[2] << std::endl;
}
deltype的作用是负责推导出表达式的类型,在这里是推导出odd的类型是一个大小为5的数组,但只是数组这种类型,要让成为一个指向这个类型的的指针,和正常一样加上*即可。