// swap: call by value voidswap(int a, int b){ int tmp = a; a = b; b = tmp; } int a = 3, b = 4; swap(a, b); printf("a = %d, b = %d\n", a, b); ############ output ############ a = 3, b = 4
// swap: call by address void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } int a = 3, b = 4; swap(&a, &b); printf("a = %d, b = %d\n", a, b); ############ output ############ a = 4, b = 3
當呼叫function 時,C 會檢查傳入的參數並複製成一模一樣的變數,雖然兩者一模一樣,但其記憶體的位置卻是不一樣,也因此第一個swap function 在交換的時候,雖然在function 內有置換成功,但是並不會影響到外部變數的結果。
#include<stdio.h> int globali = 0; voidchangeAddress(int *pi){ pi = &globali; } intmain(){ int locali = 1; int *pi = &locali; changeAddress(pi); printf("final pi = %d\n", *pi); return0; }
上方程式中的 pi 輸出為 1,雖然是傳指標進去,但是main function 內的pi 記憶體位置與 changeAddress function 內的pi 記憶體位置是不同的,如同上方所說的,當呼叫function 時,C 會檢查傳入的參數,並複製一個一模一樣的變數來使用,我們可以把記憶體位置印出來檢查看看。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#include<stdio.h> int globali = 0; voidchangeAddress(int *pi){ printf("changeAddress function, pi address = %p\n", &pi); pi = &globali; } intmain(){ int locali = 1; int *pi = &locali; printf("main function, pi address = %p\n", &pi); changeAddress(pi); printf("final pi = %d\n", *pi); return0; }
############ output ############ main function, pi address = 0x7ffedc834500 changeAddress function, pi address = 0x7ffedc8344e8 final pi = 1
可以看到當你在 changeAddress 內更改 pi 的值時,並不會影響到 main function 的pi,除非你改的是 pi 的記憶體位置。