在C++中数组永远不会按值传递它是传递第一个元素准确地说是第0 个的指针。
例如如下声明
void putValues( int[ 10 ] );
被编译器视为
void putValues( int* );
数组的长度与参数声明无关因此下列三个声明是等价的
// 三个等价的putValues()声明 void putValues( int* ); void putValues( int[] ); void putValues( int[ 10 ] );
第一种是传指针不用说了。
另外一种机制是将参数声明为数组的引用当参数是一个数组类型的引用时数组长度,
成为参数和实参类型的一部分编译器检查数组实参的长度与在函数参数类型中指定的长度是否匹配。--可能也正是因为这种限制很少使用此种方式。
// 参数为10 个int 的数组 // parameter is a reference to an array of 10 ints void putValues( int (&arr)[10] ); int main() { int i, j[ 2 ]; putValues( i ); // 错误: 实参不是 10 个 int 的数组 putValues( j ); // 错误: 实参不是 10 个 int 的数组 return 0; }
因为数组的长度现在是参数类型的一部分所以putValues()的这个版本只接受10 个int的数组。
void putValues( int (&ia)[10] ) { std::cout << "( 10 )< "; for ( int i = 0; i < 10; ++i ) { std::cout << ia[ i ]; // 用逗号分隔元素 if ( i != 9 ) std::cout << ", "; } std::cout << " >\n"; } void main() { int i[10] = {1,2,3,4,5,6,7,8,9,0}; putValues( i ); // 错误: 实参不是 10 个 int 的数组 return; }
注意:*ia周围的括号是必需的因为下标操作符的优先级较高下列声明:
int *ia[ 10 ];
将ia声明成一个含有10 个指向int 的指针的数组。