C++里面把数组当参数这个知识点一直不是很清晰。这次把他明确化了。
非引用参数
非引用参数的情况还是比较简单的。
int compute(int array[4]);
int compute(int array[]);
int compute(int *array); // 编译器会把上面两个解释成这个
- 1
- 2
- 3
以上三种原型都会被编译器解释为指针,因此即使在数组定义里写了长度为4,依然可以传任意长度的数组进来。
引用参数
首先,明确数组的引用和引用的数组。。
int compute(int &array[5]); // 引用的数组,但其实这是不合法的,引用的数组不可以作为函数参数
int compute(int (&array)[5]); // 数组的引用,可以解释为array首先被声明是个引用,然后是int[5]的引用
- 1
- 2
引用的数组不能作为参数的原因有以下几点:
- 引用使用前必须被初始化。但是数组是不能被另一个数组直接初始化的。
- 可以用指针数组替代
数组作为引用参数,如果定义了长度5,是会被检测长度的。例如下面的调用就不合法:
int data[8];
compute(data); // 8!=5 error.
- 1
- 2
会提示:invalid initialization of reference of type ‘int (&)[5]’ from expression of type ‘int [8]’
而且,data的长度是编译器就决定的,array绑定的一定是长度为5的变量。因此sizeof可以得到结果20。
// 数组作为引用参数
int compute(int (&array)[5]){
return sizeof(array); // return 20
}
// 数组作为非引用参数
int compute(int array[5]){
return sizeof(array); // return 8(array指针的长度)
}