当使用数组做函数参数时,和其他类型一样,数组形参可定义为引用或非引用。大部分情况下,数组以普通非引用类型传递,这时数组名会自动转化为指针。一般来说,非引用的形参在实际的实参传递过程中会建立一个实参的副本,但是在传递数组的过程中,由于实参是指向数组第一个元素的指针,所以形参复制的是这个指针的值而不是整个数组。
// a example
void f(int *); // pointer
void f(int array[]); // array
void f(int array[5]); // array with a size
可知上面的三种定义是等价的。对于后两种定义函数实际操纵的是指针的副本,因此不会修改实参指针的值。但是函数可以通过指针修改所指向的数组元素的值。通过指针形参所做的任何改变都是在修改数组元素本身。不需要修改数组的元素时,应将形参定义为指向const对象的指针:
// a example
void f(const int *); // pointer to const object
数组形参可定义为引用传递。这样的话,编译器不会将数组转化为指针,而是传递数组的引用。
// a example
void f(int (&array) [5]);