返回數組指針

返回數組指針

因爲數組不能被拷貝,所以函數不能返回數組。不過,函數可以返回數組的指針或者引用。其中最直接的方法就是使用類型別名。

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

可以清楚地看到函數返回類型是一個數組。

發佈了47 篇原創文章 · 獲贊 32 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章