Arduino 將數(shù)組傳遞給函數(shù)

2020-09-07 09:52 更新

要將數(shù)組參數(shù)傳遞給函數(shù),請(qǐng)指定沒(méi)有任何括號(hào)的數(shù)組的名稱。例如,如果數(shù)組 hourlyTemperatures 已聲明為函數(shù),則調(diào)用時(shí)會(huì)將數(shù)組 hourlyTemperatures 及其大小傳遞給函數(shù) modifyArray 。

重點(diǎn)

下面是在將數(shù)組傳遞給函數(shù)時(shí)需要了解的一些重要事項(xiàng)

  • 當(dāng)將數(shù)組傳遞給函數(shù)時(shí),通常也會(huì)傳遞數(shù)組大小,因此函數(shù)可以處理數(shù)組中特定數(shù)量的元素。否則,我們需要將這些知識(shí)構(gòu)建到被調(diào)用的函數(shù)中,或者更糟的是,將數(shù)組大小放在全局變量中。

  • C++ 通過(guò)引用將數(shù)組傳遞給函數(shù),即被調(diào)用函數(shù)可以修改調(diào)用者原始數(shù)組中的元素值。

  • 數(shù)組名稱的值是數(shù)組第一個(gè)元素在計(jì)算機(jī)內(nèi)存中的地址。由于數(shù)組的起始地址被傳遞,所以被調(diào)用的函數(shù)精確地知道數(shù)組存儲(chǔ)在內(nèi)存中的位置。因此,當(dāng)被調(diào)函數(shù)修改其函數(shù)體中的數(shù)組元素時(shí),它是在修改其原始內(nèi)存位置中數(shù)組的實(shí)際元素。

  • 盡管整個(gè)數(shù)組都是通過(guò)引用傳遞的,但是單個(gè)數(shù)組元素是按照簡(jiǎn)單變量的值傳遞的。

  • 要將數(shù)組的元素傳遞給函數(shù),請(qǐng)?jiān)诤瘮?shù)調(diào)用中使用數(shù)組元素的下標(biāo)名稱作為參數(shù)。

  • 對(duì)于通過(guò)函數(shù)調(diào)用接收數(shù)組的函數(shù),函數(shù)的參數(shù)列表必須指定函數(shù)期望接收的數(shù)組。

  • 例如,函數(shù) modifyArray 的函數(shù)頭可能寫為:

void modifyArray( int b[], int arraySize )
  • 該語(yǔ)句指示 modifyArray 期望接收參數(shù)b中的整數(shù)數(shù)組的地址和參數(shù) arraySize 中的數(shù)組元素的數(shù)量。數(shù)組的大小在數(shù)組括號(hào)中不是必需的。如果包括它,編譯器會(huì)忽略它;因此,任何大小的數(shù)組都可以傳遞給函數(shù)。

  • C++ 通過(guò)引用將數(shù)組傳遞給函數(shù)。當(dāng)被調(diào)用函數(shù)使用數(shù)組b時(shí),它指的是調(diào)用者中的實(shí)際數(shù)組(即本節(jié)開頭討論的 arrayhourlyTemperatures )。

注意 modifyArray 函數(shù)原型的奇怪外觀。

void modifyArray( int [] , int ) ;

這個(gè)原型可以用下列方式編寫,用于文檔目的。

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

但是,C++ 編譯器會(huì)忽略原型中的變量名。請(qǐng)記住,原型告訴編譯器參數(shù)的數(shù)量以及參數(shù)預(yù)期出現(xiàn)的順序中的每個(gè)參數(shù)的類型。

下面例子中的程序演示了傳遞整個(gè)數(shù)組和傳遞數(shù)組元素之間的區(qū)別。

例子

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

結(jié)果

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


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)