---
# System prepended metadata

title: 指標與陣列
tags: [指標與陣列]

---

###### 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）呼叫。