###### tags: `指標與陣列`
# 指標與陣列
## 指標
格式
`資料型態 *指標變數名稱;`
`int *ptr;`
陣列
# call by value, call by address and call by reference
## 傳值呼叫(call by value)
```javascript=
void swap(int x, int y) {
int tmp;
tmp = x;
x = y;
y = tmp;
}
int main() {
int a = 10, b = 20;
swap(a, b);
cout << "a = " << a << endl << "b = " << b << endl;
return 0;
}
```
執行結果
```
a = 10
b = 20
```
當執行swap(a, b)時,分別將a的數值與b的數值傳送至參數x與y,但本質上<font color="ff0000">a,b的內容並沒有改變,僅改變區域變數c與d</font>。
## 傳址呼叫(call by address)
```javascript=
void swap(int *p1, int *p2) {
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
int main() {
int a = 10, b = 20;
swap(&a, &b);
cout << "a = " << a << endl << "b = " << b << endl;
return 0;
}
```
執行結果
```
a = 20
b = 10
```
執行swap(&a, &b)時,將變數a與b的位址分別傳給指標p1與p2,所以當*p1改變時,外部變數a亦隨之改變;同理,當*p2改變時,外部變數b亦隨之改變。
## 傳參考(call by reference)
```javascript=
void swap(int &x, int &y) {
int tmp;
tmp = x;
x = y;
y = tmp;
}
int main() {
int a = 10, b = 20;
swap(a, b);
cout << "a = " << a << endl << "b = " << b << endl;
return 0;
}
```
執行結果
```
a = 20
b = 10
```
當我們呼叫函式swap時,int &會使得x自動參考變數a的位址,亦即<font color="red">變數x與變數a操作相同位址</font>,故當x的內容改變時,同時也會改變a的內容;同理,變數b的內容隨著變數y改變。此即為傳參考(call by reference)呼叫。