Arduino - 将数组传递给函数
要将数组参数传递给函数,请指定数组的名称(不带任何括号)。例如,如果数组 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++ 编译器会忽略原型中的变量名。请记住,原型会按照参数预期出现的顺序告诉编译器参数的数量和每个参数的类型。
下一个示例中的程序演示了传递整个数组和传递数组元素之间的区别。
示例
void modifyArray( int [], int ); // 看起来很奇怪;数组和大小 void modifyElement( int ); // 接收数组元素值 void setup () { Serial.begin (9600); const int arraySize = 5; // size of array a int a[ arraySize ] = { 0, 1, 2, 3, 4 }; // 初始化数组 a Serial.print ( "Effects of passing entire array by reference:" ) ; // 输出原始数组元素 for ( int i = 0; i < arraySize ; ++i ) Serial.print ( a[ i ] ) ; Serial.print (" " ) ; Serial.print ("The values of the modified array are: " ); // 输出修改后的数组元素 for ( int j = 0; j < arraySize; ++j ) Serial.print ( a[j ] ) ; Serial.print (" " ) ; Serial.print (" Effects of passing array element by value:" ); Serial.print ( " a[3] before modifyElement: " ); Serial.print ( a[ 3 ] ); Serial.print ( " a[3] after modifyElement: " ); Serial.print ( a[ 3 ] ); } void loop () { } // 在函数modifyArray中,"b"指向内存中的原始数组"a" voidmodifyArray(int b[],intsizeOfArray){ // 将每个数组元素乘以2 for(int k = 0; k < sizeOfArray; ++k) b[ k ] *= 2; } // 结束函数modifyArray // 在函数modifyElement中,"e"是从main传递的 // 数组元素a[ 3 ]的本地副本 voidmodifyElement(int e){ // 将参数乘以2 Serial.print ( "Value of element in modifyElement: " ); Serial.print ( ( e *= 2 ) ); } // 结束函数修改元素
结果
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