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