理解引用在数组上的使用
在函数传参的时候,我们经常会遇到退化现象,例如: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 -