【C++知否】函数不能返回数组,但可以返回数组指针

虽然知道函数不能返回数组,之前都是使用引用或者形参传入的数组地址,直接修改,函数返回时就不需要考虑返回数组。
这几天看到函数返回值这一章节,感觉也需要掌握返回数组指针这一方法。

因为数组不能被拷贝,所以函数不能返回数组。但是可以返回数组的指针或引用。

解决方法:使用类型别名,定义数组的指针或者引用。

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)大小。

参考这篇博客:
C语言——数组名、取数组首地址的区别(一)
C语言——数组名、取数组首地址的区别(二)

因此,我们对上面的程序梳理一下:
函数要求返回的类型是: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;
}

AltAlt


使用尾置返回类型
Alt

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值