
- Arduino 教程
- Arduino - 首頁
- Arduino - 概述
- Arduino - 開發板說明
- Arduino - 安裝
- Arduino - 程式結構
- Arduino - 資料型別
- Arduino - 變數與常量
- Arduino - 運算子
- Arduino - 控制語句
- Arduino - 迴圈
- Arduino - 函式
- Arduino - 字串
- Arduino - 字串物件
- Arduino - 時間
- Arduino - 陣列
- Arduino 函式庫
- Arduino - I/O 函式
- Arduino - 高階 I/O 函式
- Arduino - 字元函式
- Arduino - 數學庫
- Arduino - 三角函式
- Arduino 高階
- Arduino - Due & Zero
- Arduino - 脈衝寬度調製
- Arduino - 隨機數
- Arduino - 中斷
- Arduino - 通訊
- Arduino - 積體電路
- Arduino - 序列外圍介面
- Arduino 專案
- Arduino - 閃爍 LED
- Arduino - 漸變 LED
- Arduino - 讀取模擬電壓
- Arduino - LED 條形圖
- Arduino - 鍵盤登出
- Arduino - 鍵盤訊息
- Arduino - 滑鼠按鈕控制
- Arduino - 鍵盤序列埠
- Arduino 感測器
- Arduino - 溼度感測器
- Arduino - 溫度感測器
- Arduino - 水位檢測器/感測器
- Arduino - PIR 感測器
- Arduino - 超聲波感測器
- Arduino - 連線開關
- 電機控制
- Arduino - 直流電機
- Arduino - 伺服電機
- Arduino - 步進電機
- Arduino 和聲音
- Arduino - 音調庫
- Arduino - 無線通訊
- Arduino - 網路通訊
- Arduino 有用資源
- Arduino - 快速指南
- Arduino - 有用資源
- Arduino - 討論
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