一、概述
函數不能數組,但是可以返回數組的指針。
由於定義一個返回數組的指針的函數比較煩瑣(即使定義了也很難看懂),所以我們要介紹一些簡化方法。
二、使用類型別名
方法:
//way1 typedef int arrT[10]; //arrT是類型別名,表示的類型是一個數組(含有10個整數) //way2 using arrT = int[10]; //同上,arrT是含有10個整數的數組的別名
注:是數組的別名!
於是我們可以這樣定義函數:
arrT* func(形參);
解讀:func函數返回數組的指針,也即返回一個指向包含10個整數的數組的指針。
三、不使用類型別名
1. 數組的指針
形式:
int arr[10]; int (*p2)[10] = &arr; //p2是一個指向含有10個整數的數組的指針
注:int *p[10];,p是一個含有10個指針的數組。
2. 定義返回數組的指針的函數
形式:
int (*func(parameter_list))[10]; //若去掉括號,則返回的類型是指針的數組
四、使用尾置返回類型
任何函數的定義都能使用尾置返回,但是這種形式對於返回類型比較復雜的函數最有效。
形式:
//func函數返回的是一個指針,並且該指針指向了含有10個整數的數組 auto func(parameter_list) -> int(*)[10]; //在本該出現返回類型的地方象征性地放了一個auto
解讀:我們把函數的返回類型放在了形參列表之后,故可以清楚地看到func函數返回的是一個指針。
五、使用decltype
適用於:知道函數返回的指針將指向哪個數組
用法:使用decltype關鍵字聲明返回類型
示例:
int odd[] = {1, 3, 5, 7, 9}; int even[] = {0, 2, 4, 6, 8}; //返回一個指向包含5個整數的數組的指針 decltype(odd) *func(int i) { return (i % 2) ? &odd : &even; //返回一個指向數組的指針 }
解讀:func使用關鍵字decltype表示它的返回類型是個指針,並且該指針所指的對象與odd的類型一致。因為odd是數組,所以func返回一個指向包含5個整數的數組的指針。
注意:decltype不負責把數組類型轉換成對應的指針,所以decltype的結果是個數組,要想表示func返回指針還必須加上一個*符號。