uacs2024

导航

函数返回数组指针 看不太懂

有三种方法

1.声明一个返回数组指针的函数

int (*func(int i)) [10];

func(int i)  表示调用func函数所需要一个int类型的实参。
(*func(int i))  意味着我们可以对函数调用的结果执行解引操作。
        //意思就是函数调用的结果的是个指针。
(*func(int i)) [10]  表示解引用func的调用将得到一个大小是10的数组。
int (*func(int i)) [10]  表示数组中的元素是int类型。
类似于

int arr [10];        //arr是一个含有10个整数的数组
int *p1[10];        //p1是一个含有10个指针的数组
int (*p2) [10]=&arr;    //p2是一个指针,它指向含有10个整数的数组

2.使用尾值返回类型

为了表示函数真正的返回类型跟在形参列表之后,我们在本应该出现返回类型的地方放置一个auto。

//func接受一个int类型的实参,返回一个指针,该指针指向含有10个整数的数组
auto func(int i)->int(*) [10];
//int(*) [10] 和数组的指针读法一样,先读小括号里面:是个指针类型,
//再读右边:指针指向一个含有10个元素的数组,
//最后读左边:元素的类型是int型。

因为我们把函数的返回类型放在了形参列表之后,所以可以清楚地看到func函数返回的是一个指针,并且该指针指向了含有10个整数的数组。

3.使用decltype
还有一种情况,如果我们知道函数返回的指针将指向哪个数组,就可以使用decltype关键字声明返回类型。

int odd[]={1,3,5,7,9};
int even[]={0,2,4,6,8};
//返回一个指针,该指针指向含有5个整数的数组
decltype(odd) *arrPtr(int i){
    return (i%2)?&odd:&even;
}

arrPtr使用关键字decltype表示它的返回类型是个指针,并且该指针所指的对象与odd的类型一致。 因为odd是数组,所以arrPtr返回一个指向含有5个整数的数组的指针。
有一个地方需要注意:decltype并不负责把数组类型转换成对应的指针,所以decltype的结果是个数组,要想表示arrPtr返回指针还必须在函数声明时加一个*符号。

原文链接:https://blog.csdn.net/Firenze__/article/details/104065237

posted on 2024-03-09 21:06  ᶜʸᵃⁿ  阅读(16)  评论(0编辑  收藏  举报