前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++函数退化修复

C++函数退化修复

作者头像
公众号guangcity
发布2020-10-30 12:11:44
4770
发布2020-10-30 12:11:44
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

理解引用在数组上的使用

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

代码语言:javascript
复制
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,这种情况怎么解决呢?首先我们分析一下函数在传参的时候,实际上是创建了一个新的指针指向原始的数组,本质上是发生了一次拷贝,那我们只需要进制拷贝即可,而引用便可以解决这个问题。,我们改为传递引用。

代码语言:javascript
复制
int refGetLen(int (&arr)[10]) {
  // TODO
  return sizeof(arr) / sizeof(arr[0]);
}

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

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

代码语言:javascript
复制
template <typename Type, int Number>
int tGetLen(Type (&arr)[Number]) {
  // TODO
  return sizeof(arr) / sizeof(arr[0]);
}

本节完

- END -

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档