返回數組指針
因爲數組不能被拷貝,所以函數不能返回數組。不過,函數可以返回數組的指針或者引用。其中最直接的方法就是使用類型別名。
typedef int arrT[10]; //arrT是一個類型別名,表示含有10個整型數的類型
using arrT = int[10]; //同上的等價聲明
arrT* func(int i); //函數func返回一個指針,指針指向一個含有10個整型數的數組
聲明一個返回數組指針的函數
如果不使用類型別名,則數組的維度必須跟在函數名字之後。
例如:
int (*func(int i))[10]
則可以逐層理解函數意思:
* func(int i)是一個函數
* *func(int i)表示我們可以對函數返回值進行解引用,可將它替換爲一個普通變量,例如a
* 將第二步替換爲a,得到int a[10]爲一個長度爲10的整型數組,表示函數返回的值是一個解引用後爲數組的類型變量,即爲數組指針。
同理,一個返回函數指針的函數該怎麼寫呢,如下所示:
* 首先,一個函數指針可以寫成int (*a)(int,int)
* 然後,將func替換成函數,如下寫法
int (*func(int i))(int,int)
則表示了func函數返回的值解引用後爲一個函數,即返回的是一個函數指針。
舉個例子
int add(int a,int b)
{
return a+b;
}
int (*funcadd())(int,int) //一個返回函數指針的函數
{
int (*a)(int,int) = &add; //定義一個函數指針,併爲其賦值
return a;
}
int main()
{
int a=1,b=2;
cout<<(*funcadd())(a,b)<<endl; //調用函數得到函數指針,解引用後再調用返回函數
return 0;
}
尾置返回類型
C++11中簡化了上述的聲明方法,可以使用尾置返回類型,尾置返回類型跟在形參列表後面並以一個->符號開頭。爲了表示函數真正返回類型在形參列表之後,我們在本應該出現返回類型的地方放置一個auto,例如:
auto func(int i) -> int(*)[10];
可以清楚地看到函數返回類型是一個數組。