在C++中,数组永远不会按值传递。它是传递第一个元素(准确的说是第0个元素)的指针。例如,如下的声明:
void fun( int [10]) ;
被编译器视为:
void fun( int* ) ;
数组的长度与参数声明无关。因此,下列三个声明是等价的:
void fun( int* ) ;
void fun( int[] ) ;
void fun( int[10] ) ;
因此,我们需明白,数组长度不是参数类型的一部分。函数不知道传递给它的数组的实际长度,编译器也不知道。当编译器对实参类型进行参数类型检查时,并不检查数组的长度。
void fun( int [10]) ;
被编译器视为:
void fun( int* ) ;
那么我们如何在向函数传递形参时使其知道它的长度。有两种机制;
1、一种常见的机制是提供一个含有数组长度的额外参数。如
void fun( int* , int size ) ;
2、将参数声明成为数组的引用。当参数是一个数组类型的引用时,数组长度成为参数和实参类型的一部分,编译器检查数组实参的长度在函数参数类型中指定的长度是否匹配。
//参数为10个int的数组
void fun(int (&arr)[10] ) ;
int main()
{
int i ;
int j[2] ;
fun(i) ; //错误:实参类型不是10个int的数组,i不是数组
fun(j) ; //错误:实参类型不是10个int的数组,j是int类型的数组,但是其个数不是10个
return 0 ;
}
因为现在数组的长度是参数类型的一部分,所有函数fun的这个版本只接受10个int的数组。
特别注意:
当参数是多维数组时,参数必须指明第一维之外的所有维的长度。例如
void fun(int matrix[][10], int rowSize) ;
把matrix声明成一个二维数组,每行有10个列元素构成。matrix可以被等价的声明为:
int matrix[][10] ==> int (*matrix)[10]
int (*matrix)[10] :matrix是指针,指向一个数组。此数组有10个int型元素。
注意:*matrix周围的括号是必须的,因为下标操作符的优先级较高。下列声明:
int *matrix[10] ;
表示数组matrix里存放的是10个指向int型的指针

被折叠的 条评论
为什么被折叠?



