C++ —— 返回数组指针的函数 和 返回指向函数的指针的函数
返回数组指针的函数
基础知识:数组不能被拷贝,函数不能返回数组,只能返回数组的指针或者引用。
定义一个 返回数组指针的函数 的方法,以 一个接收参数为 含有10个整型元素的数组的引用 和 返回一个含有10个整型元素的数组的指针 的函数为例。
法一:(不使用别名)
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); }
法三:
//使用类型别名(1) typedef int arrT[10]; arrT* getCopyArr3(int(&arr)[10]) { return getArr(arr); }
法四:
//使用类型别名(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个元素的数组的指针;故,该声明为 一个返回数组指针的函数的函数指针
参考博文 和 《C++ primer 第5版》
---------------------------------------------------------------------------------------
最后来两个“提神醒脑”的例子:
//声明一个指向含有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)包围,说明该函数返回值为一个函数;故该声明为 一个返回函数指针的函数
版权声明 本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者 BensonLaur 和本文原始地址: |