C++函数退化修复

理解引用在数组上的使用

在函数传参的时候,我们经常会遇到退化现象,例如:int[10]退化为int*

int getLen(int arr[10]) {
  // TODO
  return sizeof(arr) / sizeof(arr[0]);
}
// 调用
int main() {
  int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
  std::cout << getLen(arr) << std::endl;
  return 0;
}

编译器会视为:int getLen(int*),发生退化,导致产生的结果是2(64位操作系统结果),原因是退化之后取的是指针 8字节除以int 4字节,得到2,我们理想的情况是输出10,这种情况怎么解决呢?首先我们分析一下函数在传参的时候,实际上是创建了一个新的指针指向原始的数组,本质上是发生了一次拷贝,那我们只需要进制拷贝即可,而引用便可以解决这个问题。,我们改为传递引用。

int refGetLen(int (&arr)[10]) {
  // TODO
  return sizeof(arr) / sizeof(arr[0]);
}

这样就可以了,这种我们可以称为数组的引用。同理不加(),又是另一种int& arr[10],这种称为引用的数组,是不合法的,因为引用只是别名,本身不占用内存,数组占用,所以这里的引用的数组矛盾。

回顾前面数组的引用例子,我们如果传入的arr类型不一致arr个数不一致都将失败,我们需要对此进行升级,那么模板就完事了。

template <typename Type, int Number>
int tGetLen(Type (&arr)[Number]) {
  // TODO
  return sizeof(arr) / sizeof(arr[0]);
}

本节完

- END -

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值