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