---
# System prepended metadata

title: 12 使用參照 (reference) 傳遞位址
tags: [Arduino, CPP]

---

###### tags: `CPP` `Arduino`

# 12 使用參照 (reference) 傳遞位址

使用指位器傳遞參數必須在呼叫函式時以 `&` 取得資料的位置, 而且函式內透過指位器取用資料時也必須記得加上 `*`, C++ 提供有另一種方式, 叫做**參照 (reference)**, 可以自動化這個程序, 避免出錯。以下是改用參照的程式：

```cpp=
const int led_pin = 5;

struct twinkle_data {
  int pin;                // LED 腳位
  int duration;           // 亮/熄總時長
  int duration_on;        // 亮燈時長 (us)
  int total;              // 切換次數
}; 

twinkle_data twinkle_datas[] = {
  {led_pin, 100, 5, 10000}, // LED 稍亮 1s
  {led_pin, 100, 30, 5000}, // LED 稍亮 0.5s
  {led_pin, 100, 100, 2000} // LED 全亮 0.2s
};

void twinkle(twinkle_data &data) {
  for(int count = 0;count < data.total; count++) {
    digitalWrite(data.pin, LOW);
    delayMicroseconds(data.duration_on);
    digitalWrite(data.pin, HIGH);
    delayMicroseconds(data.duration - data.duration_on);
  }
}
 
void setup() {
  pinMode(led_pin, OUTPUT);
}

void loop() {
  for(int i = 0; i < sizeof(twinkle_datas)/sizeof(twinkle_data); i++) {
    twinkle(twinkle_datas[i]); 
  }
}
```

1. 第 16 行在參數名稱前加了 **`&`** 符號, 表示這個參數是**參照**, 在傳遞參數時會**自動傳遞資料的位置**, 而不是傳送副本
2. 第 17~21 行取用結構成員時就直接使用 **`.`** 即可, 不必像是透過指位器那樣必須採用特別的方式。
3. 第 31 行呼叫函式時, 也不用加上 `&` 取位置。

整體來說, 使用參照就只有在定義函式時必須**標註要採用參照的參數**, 其餘就跟使用一般變數沒什麼不一樣。

:::danger
使用參照跟使用指位器都一樣要注意**在函式內修改資料**就是**修改函式外原本的資料**, 否則就會像是之前的例子一樣, 導致意外的結果。
:::