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