前面讲到了巧用引用形参可以达到很好地目的。还有一种是指针形参,它用的比较少,专用于数组形参。
问:什么时候应使用指针形参?什么时候应使用引用形参?两者的优缺点是什么?
- 使用的情况
当函数需要处理数组,且函数体不依赖于数组的长度时应使用指针形参,其他情况下用引用形参。
- 优缺点
指针形参的优点是可以明确表示函数所操纵的是指向数组元素的指针,而不是数组本身,而且可以用任意长度的实参数组来调用函数;缺点是函数体不能依赖于数组的长度,容易造成数组内存的越界访问,从而产生错误的结果或导致程序的崩溃。
void printValues(int*){...}
void printValues(int[]){...}
void printValues(int[10]){...}
上面三种定义是等价的,形参类型都是int*,即使写的是数组,默认转化成了指向数组的指针。
实参可以是任意长度的int 型数组,但是使用过程中可能会越界,不安全。
引用形参的优点是在函数体中以来数组的长度,是安全的;其缺点是限制了可以传递的实参数组,只能使用长度匹配的实参数组来调用函数。
void printValues(int (&arr)[10]){...}
这是引用形参,引用含有10个 int 型元素的数组,实参只能含有10个int 型数据。
PS: &arr 两边的圆括号是必需的!!!因为下标操作符具有更高的优先级:
f(int &arr[10]) //arr是一个数组,该数组含有是个均为int型引用的数据
f(int (&arr)[10]) //arr是一个数组的引用,该数组含有是个int型数据
所以,在用函数处理数组的时候,要多加小心。。。