返回數組指針的函數數組
基礎知識:數組不能被拷貝,函數不能返回數組,只能返回數組的指針或者引用。函數
定義一個 返回數組指針的函數 的方法,以 一個接收參數爲 含有10個整型元素的數組的引用 和 返回一個含有10個整型元素的數組的指針 的函數爲例。spa
法一:(不使用別名).net
int (*getCopyArr(int (&arr)[10]))[10] { int (*n)[10] = (int (*)[10])new int[10]; for (int i = 0; i < 10; i++) (*n)[i] = arr[i]; return n; } //note:該函數返回了分配在堆的數組,若是獲得該數組後沒有釋放內存,會致使內存泄漏,這裏僅僅做爲示例不考慮該問題
法二:指針
//尾置返回類型 (C++11標準) auto getCopyArr2(int(&arr)[10])->int(*)[10] { return getArr(arr); }
法三:code
//使用類型別名(1) typedef int arrT[10]; arrT* getCopyArr3(int(&arr)[10]) { return getArr(arr); }
法四:blog
//使用類型別名(2)(C++11 標準) using arrT2 = int[10]; arrT2* getCopyArr4(int(&arr)[10]) { return getArr(arr); }
聲明一個 返回數組指針的函數 的 函數指針的方法:內存
int (*(*getCA)(int(&)[10]))[10]; getCA = getArr;
//相似於 int sum(int a, int b)函數 //的函數指針 int(*fun)(int, int);
解讀: 由內到外順序閱讀理解,*getCA 的*說明getCA 爲一個指針;再往外其右邊有形參 (int(&)[10])說明其爲一個函數指針,其左邊又有一個*說明該函數返回的是一個指針;繼續往外,由int [10]包圍,說明該返回的指針是一個 含有10個元素的數組的指針;故,該聲明爲 一個返回數組指針的函數的函數指針get
參考博文 和 《C++ primer 第5版》io
---------------------------------------------------------------------------------------
最後來兩個「提神醒腦」的例子:
//聲明一個指向含有10個元素的數組的指針,其中每一個元素是一個函數指針,該函數的返回值是int,參數是int* int (*(*p)[10])(int *) //或 int (*(*p[10]))(int *) //來源
//定義一個含4個元素數組的指針,每一個元素爲 函數的指針,該函數參數爲 一個含10個元素的數組的引用 返回值爲 含10個元素的數組的指針 int (*(*getCA[4])(int(&)[10]))[10];
返回指向函數的指針的函數
基礎知識:和數組相似,雖然不能返回一個函數,可是能返回指向函數類型的指針
使用別名:
using F = int(int*,int); using PF = int(*)(int*,int); PF f1(int); //f1 返回函數指針 F* f2(int); //f2 同上
使用C++11標準的尾置返回類型:
auto f1(int) -> int(*)(int*,in)
直接聲明:
int (*f1(int))(int*,int);
解讀:由內到外順序閱讀理解,f1(int)有形參說明f1是一個函數,*f1(int) 說明該函數返回一個指針;繼續往外發現其由int ()(int*,int)包圍,說明該函數返回值爲一個函數;故該聲明爲 一個返回函數指針的函數