C++ —— 返回數組指針的函數 和 返回指向函數的指針的函數

返回數組指針的函數數組

基礎知識:數組不能被拷貝,函數不能返回數組,只能返回數組的指針或者引用。函數

定義一個 返回數組指針的函數 的方法,以 一個接收參數爲 含有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)包圍,說明該函數返回值爲一個函數;故該聲明爲 一個返回函數指針的函數

相關文章
相關標籤/搜索