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