天天看点

C++第6章:返回类型:返回数组的指针 或 数组的引用

返回数组指针

因为数组不能被拷贝,所有函数不能返回数组,但是可以返回数组的指针或引用:

使用类型别名:

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);