C語言 形式參數和實際參數
函數中的參數有兩種,形式參數,簡稱形參;實際參數,簡稱實參。主調函數調用被調函數時的數據傳遞是通過實參數據傳遞給形參來實現(xiàn)的。
?形式參數:定義函數時使用的參數,只能在該函數體內使用。
?實際參數:引用函數時使用的參數。
當發(fā)生函數調用時,主調函數把實參的值復制一份,傳送給被調用函數的形參,從而實現(xiàn)主調函數向被調用函數的數據傳送。
【例題】實參到形參的數據傳遞
程序如下:
#include<stdio.h>
int sum(int x,int y) /* 定義函數,形參為x,y */
{
x=x+y;
y=x+y;
return x;
}
void main()
{
int a=l,b=3,c;
c=sum(a.b); /* 調用函數,并將實參a, b值傳遞過去 */
printf("sum of %d,%d is %d\n",a,b,c);
}
程序執(zhí)行后,輸出結果為:
sum of 1,3 is 4
①程序執(zhí)行時,當執(zhí)行到c=sum(a,b);語句時,執(zhí)行函數調用,同時為函數sum()的形參X、y分配內存空間。
②計算實參a、b的值傳遞給形參x、y; x得到值1, y得到值3。
③執(zhí)行函數sum()的語句,通過計算變量x的值變?yōu)?,變量y的值變?yōu)?。
④執(zhí)行遇到return語句,函數執(zhí)行結束,將變量x的值作為函數值帶回。同時,釋放函數sum()中定義的變量(包括形參x、y)所分配的內存空間。
說明:
①形式參數只有當函數被調用時才被分配相應的內存,調用結束后立即釋放所分配的內存單元。因此,形參只在本函數內有效。調用結束,返回調用函數后,則不能再使用該形參變量。
②實參可以是常量、變量、表達式、函數等。無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值,以便向對應的形參標識的內存單元傳遞數據。應預先用實參變量、賦值計算等辦法,使實參獲得確定的值。形參則只能是變量,不能是一個表達式。例如以下語句是正確的:
c=sum( 3+2,7);
執(zhí)行時先將3+2計算出來,之后賦給形參變量X。
③實參與形參必須個數相同。
④對應的形參和實參的類型必須一致。
⑤C語言中,函數調用時數據傳遞是值傳遞的形式。也就是說只能將實參的值單向傳遞給形參,而形參所做的改變不能帶回調用函數。因為,實參和形參在內存中占據不同的內存空間。上述中,對形參變量y的值經過計算變成7,但y的值無法帶回,所以實參b的值仍為3。例如:有人試圖編寫一個 函數實現(xiàn)兩個變量的交換,程序如下:
void swap(int m,int n)
{
int t;
t=m;
m=n;
n=t;
}
main()
{
int a=3,b=5;
swap(a,b);
printf ("after swap:\n");
printf("%a=d b=%d\n",a,b);
}
編程者本意是想在swap()函數中實現(xiàn)變量交換,之后將交換后的結果帶回到main()函數,但由于C語言中實參到形參是單向傳遞的,所以程序執(zhí)行后,輸出結果為:
after swap:
a=3 b=5
可見,形參的改變并沒有影響到實參。
⑥定義函數時,形參不占內存空間,只有當函數被調用時,才為形參分配內存空間,接收由實參傳遞來的值。因實參和形參占用不同的內存單元,即使實參與形參同名也互不影響。
例如:
void fun(int a)
{
int d=2;
a=d++;
printf("%d ",a);
}
main()
{
int a=1;
fu(a);
printf(%d \n",a);
}
程序執(zhí)行,輸出結果為:
2 1
程序中,形參變量名為a,實參變量名也為a,雖然變量名相同,但他們占據的是不同的內存單元,形參變量a只有在函數被調用才會被分配內存空間,得到從實參傳遞過來的數據,而在函數執(zhí)行期間,main()函數中的變量a也不能再使用。當函數調用結束,形參所占內存空間隨即被釋放。
點擊加載更多評論>>