声明返回数组指针的函数
2014-05-18 12:43
239 查看
时间:2014.05.18
地点:基地
------------------------------------------------------------------------
在来复习几个基础知识
------------------------------------------------------------------------
一个例子:
(*func(int)) 意味着对函数调用的结果是一个指针
(*func(int i))[10] 意味着对函数调用结果的指针是一个指向数组,数组大小为10
int (*func(int))[10] 意味着对函数调用结果的指针指向的数组中,数组元素都是整型的。
但正如前面所说,
若果我们使用类型别名,声明一个返回数组指针的函数的函数就看起来要优雅多了
------------------------------------------------------------------------
------------------------------------------------------------------------
地点:基地
------------------------------------------------------------------------
一、基本知识
常识:数组不能被拷贝,函数不能返回数组,只能返回数组的指针或者引用。typedet int arr[10]; //arr是类型别名,表示的类型含有10个整数的数组上述语句等效于
using arr=int[10]
在来复习几个基础知识
int arr[10]; //arr是一个含有10个整数的数组 int *p1[10]; //p1和[ ]的结合度要高,所以p1首先是一个10个大小的数组,即这里的p是一个数组名,其次是与*结合,表数组中每个元素都是整型指针 int (*p)[10]=&arr; //由于括号p首先与*结合,即p是一个指针,然后才与[ ]结合,说明p指针指向大小为10的一个数组,且p指针初始化,p是一个数组指针
------------------------------------------------------------------------
二、声明返回数组的指针
联系一般的赋值语句:int a=b; int a=fun(c);即发生函数调用时这里的func(c)和b等同的地位,于是,当函数返回数组指针时我们也要等同于 int (*p)[10]的形式,按照这种法则,返回函数指针的函数形式如下:
Type(*function(parameter_list))[dimension]和函数指针 int(*p)[10]对应,(*function(parameter_list))是相当于(*int p),后面在跟上返回数组指针所指向的数组的维度。
一个例子:
int (*func(int i))[10];func(int i) 意味着调用func函数时需要一个int类型的实参
(*func(int)) 意味着对函数调用的结果是一个指针
(*func(int i))[10] 意味着对函数调用结果的指针是一个指向数组,数组大小为10
int (*func(int))[10] 意味着对函数调用结果的指针指向的数组中,数组元素都是整型的。
但正如前面所说,
若果我们使用类型别名,声明一个返回数组指针的函数的函数就看起来要优雅多了
using arrT=int[10]; //arr是大小为10的数组的一个别名,即相当于把int[10]看成是一种类型,该类型是一个整型数组,大小为10有了这,现在声明一个返回数组指针的函数时就是声明一个返回这样类型的指针了,于是很优雅的如下:
arrT* func(int i);
------------------------------------------------------------------------
三、使用尾置返回类型
在上面方式中,个人非常喜欢用using语句,它非常直观简明。然而在声明返回类型时,我们还有一种更简洁的办法,那就是使用尾置返回类型。任何函数的定义都能使用尾置返回,它在形参列表后以一个 -> 符号开头,为表示函数真正的返回类型在形参列表之后,我们在最前放置一个auto,比如:auto func(int i)->int(*)[10]; //func接受一个int类型的实参,返回一个指针,指针指向10个整数的数组于是现在就可以清楚地看到func函数返回的是一个指针,该指针指向10个整数的数组。
------------------------------------------------------------------------
四、使用decltype
若果知道函数返回的指针指向哪个数组还可以使用decltype关键字声明返回类型,比如一个典型的例子:#include<iostream> int odd[] = { 1, 3, 5, 7, 9 }; int even[] = { 0, 2, 4, 6, 8 }; decltype(odd)* func(int i) { return (i & 1) ? &odd : &even; } int main() { std::cout << (*func(1))[2]<< std::endl; std::cout << (*func(2))[2] << std::endl; }deltype的作用是负责推导出表达式的类型,在这里是推导出odd的类型是一个大小为5的数组,但只是数组这种类型,要让成为一个指向这个类型的的指针,和正常一样加上*即可。
相关文章推荐
- 声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是()
- 返回类型是函数指针的函数指针 类比复杂的数组声明
- php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
- 函数的返回值问题(返回指针和数组的区别)静态存储区、动态数据区、栈
- C语言中的声明解析规则——数组,指针与函数
- 一个复杂的声明,包含数组指针,指针数组,函数指针和指针函数的区别
- C语言 通过指针从函数返回一个数组
- 使用指针从函数返回一个数组
- C语言中的声明解析规则——数组,指针与函数
- c语言复杂变量声明(数组、指针、函数)
- 函数返回数组指针例程
- [Happy Coding] 函数返回数组指针和数组引用
- 函数返回指针和返回数组名的区别 (very good)
- 关于函数指针数组与返回数组指针的函数
- php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
- 【php数组函数序列】之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
- 函数返回指针和返回数组名的区别
- [C/C++]如何解读返回函数指针的函数声明
- C/C++函数返回数组指针的一点点小姿势
- 关于函数指针数组与返回数组指针的函数