将数组传递给函数(Passing Arrays to Functions)
要将数组参数传递给函数,请指定不带任何括号的数组名称。 例如,如果已将数组hourlyTemperatures声明为函数,则调用将数组hourlyTemperatures及其大小传递给modifyArray函数。
重点
以下是将数组传递给函数时需要了解的一些重要事项列表 -
将数组传递给函数时,通常也会传递数组大小,因此该函数可以处理数组中特定数量的元素。 否则,我们需要将这些知识构建到被调用函数本身中,或者更糟糕的是,将数组大小放在全局变量中。
C ++通过引用将数组传递给函数,即被调用函数可以修改调用者原始数组中的元素值。
数组名称的值是数组第一个元素的计算机内存中的地址。 由于传递了数组的起始地址,被调用的函数精确地知道数组在存储器中的存储位置。 因此,当被调用函数修改其函数体中的数组元素时,它正在修改其原始内存位置中的数组的实际元素。
尽管整个数组都是通过引用传递的,但各个数组元素的传递值与简单变量完全相同。
要将数组的元素传递给函数,请使用数组元素的下标名作为函数调用中的参数。
对于通过函数调用接收数组的函数,函数的参数列表必须指定函数期望接收数组。
例如,函数modifyArray的函数头可能写为 -
void modifyArray( int b[], int arraySize )
该语句指示modifyArray期望接收参数b中的整数数组的地址以及参数arraySize中的数组元素的数量。 数组括号中不需要数组的大小。 如果包含它,编译器会忽略它; 因此,任何大小的数组都可以传递给函数。
C ++通过引用将数组传递给函数。 当被调用函数使用数组名称b时,它引用调用者中的实际数组(即本节开头讨论的arrayhourlyTemperatures)。
请注意modifyArray函数原型的奇怪外观。
void modifyArray( int [] , int ) ;
这个原型可以用以下方式编写以用于文档目的。
void modifyArray( int anyArrayName[], int anyVariableName ) ;
但是,C ++编译器会忽略原型中的变量名称。 请记住,原型告诉编译器参数的数量以及参数预期出现的顺序中每个参数的类型。
下一个示例中的程序演示了传递整个数组和传递数组元素之间的区别。
例子 (Example)
void modifyArray( int [], int ); // appears strange; array and size
void modifyElement( int ); // receive array element value
void setup () {
Serial.begin (9600);
const int arraySize = 5; // size of array a
int a[ arraySize ] = { 0, 1, 2, 3, 4 }; // initialize array a
Serial.print ( "Effects of passing entire array by reference:" ) ;
// output original array elements
for ( int i = 0; i < arraySize ; ++i )
Serial.print ( a[ i ] ) ;
Serial.print ("\r" ) ;
Serial.print ("The values of the modified array are:\n" );
// output modified array elements
for ( int j = 0; j < arraySize; ++j )
Serial.print ( a[j ] ) ;
Serial.print ("\r" ) ;
Serial.print ("\r\rEffects of passing array element by value:" );
Serial.print ( "\ra[3] before modifyElement: " );
Serial.print ( a[ 3 ] );
Serial.print ( "\ra[3] after modifyElement: " );
Serial.print ( a[ 3 ] );
}
void loop () {
}
// in function modifyArray, "b" points to the original array "a" in memory
void modifyArray( int b[], int sizeOfArray ) {
// multiply each array element by 2
for ( int k = 0 ; k < sizeOfArray ; ++k )
b[ k ] *= 2;
}
// end function modifyArray
// in function modifyElement, "e" is a local copy of
// array element a[ 3 ] passed from main
void modifyElement( int e ) {
// multiply parameter by 2
Serial.print ( "Value of element in modifyElement: " );
Serial.print ( ( e *= 2 ) );
}
// end function modifyElement
结果 (Result)
Effects of passing entire array by reference:01234
The values of the modified array are:01234
Effects of passing array element by value:
a[3] before modifyElement: 3
a[3] after modifyElement: 3
$ is not a hexadecimal digit
f is a hexadecimal digit