最近看C++ primer,看到《C++ primer》6.3.3练习,要求书写返回数组引用的函数声明,觉得有必要实践记录一下。
这里先总结返回数组的引用的的函数声明写法(下面的Type是
数组元素的类型,可以是int、float等,如果要返回指向数组的指针亦同,将下面的&
改成*
即可)
- 写法1
函数声明为:
decltype(odd) &arrPtr(int i); //odd是个数组,需要在前面定义如int odd[]={1,2,3};
- 写法2
函数声明为:
Type (&arrPtr(int i))[5]; //返回5个元素数组的引用
- 写法3
函数声明为:
auto arrPtr(int i) -> Type (&)[5];//返回5个元素数组的引用
- 写法4
在开头使用类型别名
using arr = Type[5];//using的类型别名
或
typedef Type arr[5];//typedef的类型别名
函数声明为:
arr &arrPtr(int i) //返回5个元素数组的引用
写一段代码看看
#include <iostream>
using namespace std;
int odd[] = {1, 3, 5, 7, 9};
int even[] = {2, 4, 6, 8, 10};
decltype(odd) &arrPtr(int i);
int main(int argc, char *argv[])
{
int *q = arrPtr(2);
for (int *p = q; p != q + 5; p++)
cout << *p << " ";
}
decltype(odd) &arrPtr(int i)
{
return (i % 2) ? odd : even;
}
输出
如果把代码中的int *q = arrPtr(2);
改成
int *q = arrPtr(1);
所以返回的引用是什么呢?我们在main函数添加下面的语句:
cout << odd << endl;
cout << arrPtr(1) << endl;
打印的地址其实是一样的,这说明:返回的是数组的头指针。