一般的變數值設定敘述,都是直接傳遞數值,以交換兩個變數值為例,底下敘述執行後,經第三者(temp)助力,a和b值就互換完成:
但若把以上敘述包裝成自訂函式,情況就不一樣了,因為函式的參數或在其中宣告的變數,屬於「區域」型。
左下圖的swap()自訂函式將接收x和y兩個整數型參數,呼叫此函式傳入並傳遞參數時,資料將被複製給函式參數,因而稱作傳值呼叫(call by value)。此自訂函式執行完畢,資料僅在其內部達成交換,x, y和temp也會被刪除,所以a和b變數值並未交換。
右上圖的敘述則是在呼叫函式時,傳遞資料的位址給參數(參閱《超圖解Arduino 互動設計入門》第八章「認識Pointer」),所以函式處理的資料跟呼叫方是同一份,這種函式執行與參數傳遞方式稱作傳址呼叫(call by reference)。
搭配右上角的swap()傳址自訂函式,在序列埠監控視窗顯示交換前後的程式碼如下:
像這種單純驗證語法的程式碼,最適合用Arduino模擬器測試。只要在Tinkercad的新電路中,放置一個Arduino板:
在程式碼編輯器,輸入這個程式:
void swap(int* x, int* y) { int temp = *x; *x = *y; *y = temp; } void setup() { int a=10, b=20; Serial.begin(9600); // 交換之前的a和b值 Serial.println(String("Before swap:") + "\t" + a + "\t" + b); swap(&a, &b); // 交換之後… Serial.println(String("After swap:") + "\t" + a + "\t" + b); } void loop() { // 這裡沒有程式 }
點擊程式編輯器底部的「串列監視器」,開啟它:
按下「開始模擬」鈕,將能在串列監視器顯示a, b變數值交換結果:
若要編輯程式碼,請先按下「停止模擬」鈕。