形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用抢蚀, 離開該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中镰禾,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用唱逢。 形參和實(shí)參的功能是作數(shù)據(jù)傳送吴侦。發(fā)生函數(shù)調(diào)用時(shí), 主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送坞古。
1.形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元备韧,在調(diào)用結(jié)束時(shí), 即刻釋放所分配的內(nèi)存單元痪枫。因此织堂,形參只有在函數(shù)內(nèi)部有效。 函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量奶陈。
2.實(shí)參可以是常量易阳、變量、表達(dá)式吃粒、函數(shù)等潦俺, 無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí)徐勃,它們都必須具有確定的值集嵌, 以便把這些值傳送給形參等曼。 因此應(yīng)預(yù)先用賦值,輸入等辦法使實(shí)參獲得確定值。
3.實(shí)參和形參在數(shù)量上柔袁,類型上,順序上應(yīng)嚴(yán)格一致铺峭, 否則會(huì)發(fā)生“類型不匹配”的錯(cuò)誤。
4.函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的冀自。 即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參幅聘。 因此在函數(shù)調(diào)用過程中凡纳,形參的值發(fā)生改變,而實(shí)參中的值不會(huì)變化帝蒿。
void Exchg1(int x, int y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf("Exchg1:x=%d,y=%d\n",x,y);
}
void Exchg2(int &x, int &y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf("Exchg2:x=%d,y=%d\n",x,y);
}
void Exchg3(int *x, int *y)
{
int tmp;
tmp=*x;
*x=*y;
*y=tmp;
printf("Exchg3:x=%d,y=%d\n",*x,*y);
}
void main()
{
int a=4,b=6;
Exchg1 (a,b) ;
printf("a=%d,b=%d\n",a,b);
Exchg2 (a,b);
printf("a=%d,b=%d\n",a,b);
Exchg3(&a,&b) ;
printf("a=%d,b=%d\n",a,b);
}
這里Exchg1函數(shù)被調(diào)用的時(shí)候荐糜,并沒有成功交換a跟b的數(shù)據(jù)。為何呢葛超。
int a=4,b=6;
Exchg1 (a,b) ; //這里本質(zhì)上發(fā)生的是:Exchg1 (intx=a,int y=b) ; x跟y是函數(shù)定義里面的形參暴氏,也就是說這里只是把實(shí)參a跟b的值賦予了x,y這2個(gè)形參變量。接下來绣张,函數(shù)里發(fā)生的值互換只換掉了x跟y的值答渔,而實(shí)參a跟b沒有影響。
再看Exchg2 (a,b); //再看本質(zhì)Exchg2 (int &x=a,int &y=b); 這里x跟y都是a,b的引用侥涵,操作x跟y交換就等于a跟b交換沼撕,自然,調(diào)用Exchg2 可以成功交換a跟b
Exchg3(&a,&b) ; //Exchg3(int *x=&a,int *y=&b); x跟y2個(gè)形參是a跟b的指針芜飘,也就是實(shí)參數(shù)據(jù)存放的地址务豺。然后函數(shù)里交換了x跟y指向的數(shù)據(jù),也就是實(shí)參a跟b嗦明,所以笼沥,交換也是成功的。
代碼運(yùn)行的結(jié)果娶牌,exchg1沒有交換a,b值奔浅;exchg2交換了a,b值,到了exchg诗良,a,b的值似乎沒有交換汹桦,仍舊是a為4,b為6,剛開始以為代碼有問題累榜,后來設(shè)置了斷點(diǎn)之后营勤,發(fā)現(xiàn)代碼運(yùn)行到exchg3(&a,&b)時(shí),a=6,b=4了壹罚,所以代碼運(yùn)行結(jié)果和初始值一樣的話葛作,說明已經(jīng)交換了a,b的值,至此說明代碼是沒有任何問題的猖凛。