C的形參和實參的關係
形參變數只有在被呼叫時才分配記憶體單元,在呼叫結束時,即刻釋放所分配的記憶體單元。因此,形參只在函式內部有效。函式呼叫結束返回主呼叫函式後則不能再使用該形參變數。
在一般傳值呼叫的機制中只能把實參傳送給形參,而不能把形參的值反向地傳送給實參。因此在函式呼叫過程中,形參值發生改變,而實參中的值不會變化。
而在引用呼叫的機制當中是將實參引用的地址傳遞給了形參,所以任何發生在形參上的改變實際上也發生在實參變數上。要想改變函式外部定義的變數,必須將此變數的地址作為引數傳遞給引數,然後在函式內修改這個地址內的資料的值,這樣的修改才有效.
舉下面題目為例子
void fun(int x, int y)
{
int temp = 0;
if(x < y)
{
temp = x ;
x = y ;
y = temp;
}
}
main()
{
int a = 4, b = 3, c = 5;
fun(a, b);
fun(a,c);
fun(b,c);
printf(“%d, %d, %d”, a, b, c);
}
A、3, 4, 5
B、5, 3, 4
C、4, 3, 5
D、5, 4, 3
========================================
答案是C
一看題目,就一步一步計算,但最後a, b, c的值都沒變,因為它們是實參,要想改變實參的值,必須把實參的地址傳遞給形參,這樣才能改變實參的值.
總結如下
1、直接用變數傳參一般是不能傳遞的。因為變數在傳遞中是兩個等值的不同變數,兩者互不影響。
2、如果是指標形參p,實參q,而且在被調函式中是對*p做的修改,那這時候這種修改可以傳遞。因為這時候是對p q指向的記憶體的直接修改,這種修改可以儲存,從而傳遞出來。
3、對陣列形參做的修改也可以傳遞。陣列名是一個常指標。