其實就是把變量或常量復制了一份給函數中的變量,簡單說來就是復制的過程。
有一個很經典的問題:用函數交換兩個變量的值。
int a=1;
int b=2;
swap(a,b)
有一個函數是這樣實現的
voidswap(int m,int n)
{
int t;
t=m;m=n;n=t;
}
printf("a=%d b=%d",a,b);
最后輸出a和b的值,我們預期a和b的值可能被交換了,但實際上根本沒有,是怎么回事呢?
問題出在函數參數傳遞,實際上在調用swap(a,b)發生的一個“值復制”過程
m=a,n=b //把a的值復制給了m,把b的值復制給了n
而在swap函數內部是實現了被復制的a和被復制的b的交換,而在函數外部並沒有完成原始的a和原始的b的交換
如果函數參數是指針為什么又可以呢?
int a=1;
int b=2;
swap(&a,&b)
voidswap(int *m,int *n)
{
int t;
t=*m;*m=*n;*n=t;
}
在調用 swap(&a,&b)的時候是一個“地址復制”的過程,具體如下
m=&a,n=&b//把變量a的地址復制給了m,把變量b的地址復制給了n
在函數內部
*m就等於*&a,也就是在函數內部訪問到了函數外部的a
*n就等於*&b也就是b。也就是在函數內部訪問到了函數外部的b