虽然知道函数不能返回数组,之前都是使用引用或者形参传入的数组地址,直接修改,函数返回时就不需要考虑返回数组。
这几天看到函数返回值这一章节,感觉也需要掌握返回数组指针这一方法。
因为数组不能被拷贝,所以函数不能返回数组。但是可以返回数组的指针或引用。
解决方法:使用类型别名,定义数组的指针或者引用。
typedef int arrT[10];//arrT是一个类型别名,表示的类型是含有10个整数的数组。
using arrT=int[10];//类型别名的等价声明
arrT* func(int i);//返回数组指针
上面的两者类型别名定义方式都可以。
那怎么使用呢?
typedef int arrT[10];
using arrT=int[10];
int arr[10]={0,0,0,0,0,0,0,0,0,0};
arrT* func(int i){
for(int j=0;j<10;j++){
arr[j]=i;
}
return &arr;//注意这里的返回值
}
上面是我们定义的一个返回数组指针的函数,可以看到return的是数组的首地址。注意,因为函数返回类型是指针,所以这里必须获取数组的地址。
那么这里就有一个问题了:arr
不是数组的首地址吗,为什么还要用取地址符&
?(小白的困惑)
其实只要记住,arr
和&arr
仅仅只是值相同,但是两者的意义不同;
arr
,等价于 &arr[0]
——表示数组的首元素的地址;
&arr
,——表示数组的首地址;
如果对两者进行+1
操作,那么就能看出区别了:
arr
由于是数组首元素的地址,arr的类型就是数组元素的类型,比如int,那么执行+1
操作,就是向前移动4个字节(int大小)。
&arr
是数组的首地址,执行+1
操作,会向前移动整个数组大小的字节,比如,数组中有5个int型元素,那么就是移动5*sizeof(int)
大小。
因此,我们对上面的程序梳理一下:
函数要求返回的类型是:arrT *
,即数组类型;
如果我们返回return arr
,这个返回的是数组元素,它的地址,应该使用int *
去接收。
调用函数:
arrT *A;
A=func(8);
for(int i=0;i<10;++i){
cout<<(*A)[i]<<endl;
}
首先,定义一个数组指针来接收函数的返回值。这里需要注意,我们怎么获取数组的元素值——分析一下:
A——是arrT *
类型,即数组的指针,A的值是数组首地址;
可以这么看,A=&arr,先解引用 (*A)= *&arr = arr
,
(*A)[ i ] = arr[ i ]
;
如果不想使用类型别名,可以使用返回数组指针的函数形式:
int (*func(int i))[10]{
for(int j=0;j<10;j++){
arr[j]=i;
}
cout<<endl;
return &arr;
}
使用尾置返回类型