位置:首頁 > 軟件操作教程 > 編程開發(fā) > C語言 > 問題詳情

C語言 形式參數(shù)和實(shí)際參數(shù)

提問人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-01

函數(shù)中的參數(shù)有兩種,形式參數(shù),簡(jiǎn)稱形參;實(shí)際參數(shù),簡(jiǎn)稱實(shí)參。主調(diào)函數(shù)調(diào)用被調(diào)函數(shù)時(shí)的數(shù)據(jù)傳遞是通過實(shí)參數(shù)據(jù)傳遞給形參來實(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值傳遞過去 */

    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);語句時(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()的語句,通過計(jì)算變量x的值變?yōu)?,變量y的值變?yōu)?。

④執(zhí)行遇到return語句,函數(shù)執(zhí)行結(jié)束,將變量x的值作為函數(shù)值帶回。同時(shí),釋放函數(shù)sum()中定義的變量(包括形參x、y)所分配的內(nèi)存空間。

說明:

①形式參數(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ù)等。無論實(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á)式。例如以下語句是正確的:

c=sum( 3+2,7);

執(zhí)行時(shí)先將3+2計(jì)算出來,之后賦給形參變量X。

③實(shí)參與形參必須個(gè)數(shù)相同。

④對(duì)應(yīng)的形參和實(shí)參的類型必須一致。

⑤C語言中,函數(shù)調(diào)用時(shí)數(shù)據(jù)傳遞是值傳遞的形式。也就是說只能將實(shí)參的值單向傳遞給形參,而形參所做的改變不能帶回調(diào)用函數(shù)。因?yàn)?,?shí)參和形參在內(nèi)存中占據(jù)不同的內(nèi)存空間。上述中,對(duì)形參變量y的值經(jīng)過計(jì)算變成7,但y的值無法帶回,所以實(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語言中實(shí)參到形參是單向傳遞的,所以程序執(zhí)行后,輸出結(jié)果為:

    after swap:

    a=3 b=5

可見,形參的改變并沒有影響到實(shí)參。

⑥定義函數(shù)時(shí),形參不占內(nèi)存空間,只有當(dāng)函數(shù)被調(diào)用時(shí),才為形參分配內(nèi)存空間,接收由實(shí)參傳遞來的值。因?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í)參傳遞過來的數(shù)據(jù),而在函數(shù)執(zhí)行期間,main()函數(shù)中的變量a也不能再使用。當(dāng)函數(shù)調(diào)用結(jié)束,形參所占內(nèi)存空間隨即被釋放。

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部