Arduino - 向函式傳遞陣列



要將陣列引數傳遞給函式,請指定陣列名稱,無需任何括號。例如,如果已將陣列hourlyTemperatures宣告為函式,則呼叫會將陣列hourlyTemperatures及其大小傳遞給函式modifyArray

重點

以下列出了一些在將陣列傳遞給函式時需要了解的重要事項:

  • 將陣列傳遞給函式時,通常也會傳遞陣列大小,以便函式可以處理陣列中的特定數量的元素。否則,我們需要將此知識構建到被呼叫函式本身中,或者更糟糕的是,將陣列大小放在全域性變數中。

  • C++ 透過引用傳遞陣列給函式,即被呼叫函式可以修改呼叫者原始陣列中的元素值。

  • 陣列名稱的值是計算機記憶體中陣列第一個元素的地址。由於傳遞了陣列的起始地址,因此被呼叫函式精確地知道陣列儲存在記憶體中的位置。因此,當被呼叫函式在其函式體中修改陣列元素時,它正在修改其原始記憶體位置中的陣列的實際元素。

  • 儘管整個陣列是透過引用傳遞的,但單個數組元素是按值傳遞的,就像簡單的變數一樣。

  • 要將陣列的元素傳遞給函式,請在函式呼叫中使用陣列元素的下標名稱作為引數。

  • 為了使函式透過函式呼叫接收陣列,函式的引數列表必須指定函式期望接收陣列。

  • 例如,函式modifyArray的函式頭可以寫成:

void modifyArray( int b[], int arraySize )
  • 該語句表示modifyArray期望在引數b中接收一個整數陣列的地址,並在引數arraySize中接收陣列元素的數量。陣列大小在陣列括號中不是必需的。如果包含它,編譯器會忽略它;因此,可以將任何大小的陣列傳遞給函式。

  • C++ 透過引用將陣列傳遞給函式。當被呼叫函式使用陣列名稱b時,它指的是呼叫者中的實際陣列(即本節開頭討論的陣列hourlyTemperatures)。

請注意modifyArray函式原型的奇怪外觀。

void modifyArray( int [] , int ) ;

出於文件目的,此原型可以按以下方式編寫。

void modifyArray( int anyArrayName[], int anyVariableName ) ;

但是,C++ 編譯器會忽略原型中的變數名。請記住,原型告訴編譯器引數的數量以及每個引數的型別以及引數的預期出現順序。

下一個示例中的程式演示了傳遞整個陣列和傳遞陣列元素之間的區別。

示例

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

結果

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
arduino_arrays.htm
廣告