返回数组指针
因为数组不能被拷贝,所有函数不能返回数组,但是可以返回数组的指针或引用:
使用类型别名:
typedef int arrT[10];//arrT是一个类型别名 ,表示含有10个整数的数组
或 using arrT =int[10];
则 arrT *func(int i) //返回一个指向含有10个整数的数组的指针
//如果不使用类型别名 ,则需要牢记数组的维度
int arr[10];//
int *p1[10]//含10个指针的数组
int (*p2)[10] =&arr; //p2指向的是整个数组的地址
int *p3 = arr ; //p3指向的是数组的第一元素的首地址
//p2指向的是整个数组的地址 //p3指向的是数组的首地址
//具体:声明一个返回数组指针的函数
int (*func(int i))[10];
可以按照以下的顺序来逐层理解该声明的含义:
func(int i)表示调用func函数时需要一个int类型的实参。
(*func(int i))意味着对我们可以对函数调用的结果执行解引用操作。
(*func(int i))[10]表示解引用func的调用将得到一个大小是10的数组。
int (*func(int i))[10]表示数组中的元素是int类型。
int s[2] = { 0,1 };
int * arrf()
{
return s; //返回的数组的首地址 解引用得到的是第一个元素
}
int (*af(int i))[2]
{
return &s; //返回的是整个数组的地址 意思是解引用直接得到整个数组
}
int main()
{
cout << (*af(1))[0] << (*af(1))[1] << endl; //解引用后就当于在操作数组,属于 输出是 0 1;
}
以上以及使用尾置和decltype返回一个数组的指针
int(*fun(int i))[10];
auto fun1(int i) -> int(*)[10];
int aod[] ={1,3,5,7,9};
decltype(odd) * arrptr () //decltype(odd) 返回的是一个数组,要向表示是指针,所以加上*号
{
return &odd;
}
返回数组的引用,类似于指针 ,下面举几个例子,
//一般就把*换成引用&
string s1[10] = { "aa","aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa" };
string(&fun2(int i))[10];
auto fun3(int i)->string(&)[10];
using ArrT = string[10];
ArrT& func5(int i);
decltype(s1) &fun4(int i);