孫勤
摘要:在C+ +程序設(shè)計(jì)函數(shù)調(diào)用過(guò)程中,函數(shù)參數(shù)的傳遞是至關(guān)重要的內(nèi)容,參數(shù)傳遞的方式不同,其傳遞的內(nèi)容也不同類型,在程序設(shè)計(jì)過(guò)程中,選擇恰當(dāng)?shù)膮?shù)傳遞方式,不僅可以使程序更加簡(jiǎn)潔,同時(shí)可以提供程序的運(yùn)行效率,該文較為全面的論述了C++中函數(shù)參數(shù)傳遞的幾種常見(jiàn)方式以及各種方式的優(yōu)點(diǎn)及區(qū)別。
關(guān)鍵詞:C++;函數(shù)調(diào)用;參數(shù)傳遞
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)21-5116-03
Discussion on the Function Parameter Passing in C++ Programming
SUN Qin
(Gansu Agricultural University, Lanzhou 730070, China))
Abstract: In the process of function call of C+ + programming, the function parameter passing is of the utmost importance. When the methods of parameter passing are different, the contents passed are also of different styles. In the programming, selecting proper methods of parameter passing can not only simplify the program, but also can promote the operation efficiency of the program. This paper gives a com prehensive discussion about several common methods of the function parameter passing in C+ + as well as their advantages and their differ ences.
Key words: C++; function call; function parameter passing
C++語(yǔ)言是在C語(yǔ)言的基礎(chǔ)上擴(kuò)充了面向?qū)ο蟮母拍詈拖鄳?yīng)的處理機(jī)制而形成的一種混合型的程序設(shè)計(jì)語(yǔ)言,C++全面兼容C。在一個(gè)C/C++程序中,為避免主函數(shù)龐雜、頭緒不清,閱讀和維護(hù)困難,經(jīng)常用模塊化程序設(shè)計(jì)的思路,采用“組裝”的辦法簡(jiǎn)化程序設(shè)計(jì)的過(guò)程,即事先編好一批實(shí)現(xiàn)各種不同功能的函數(shù),把它們保存在函數(shù)庫(kù)中,需要時(shí)直接用。C/C++程序可由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成,主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。在程序設(shè)計(jì)中善于利用函數(shù),可以減少重復(fù)編寫程序段的工作量,同時(shí)可以方便地實(shí)現(xiàn)模塊化的程序設(shè)計(jì)。
1 C++中的函數(shù)
從用戶使用的角度看,函數(shù)有兩種,一是庫(kù)函數(shù),它是由系統(tǒng)提供的;二是用戶自己定義的函數(shù),它是用以解決用戶專門需要的函數(shù)。
從函數(shù)的形式看,函數(shù)分兩類。
1)無(wú)參函數(shù)。無(wú)參函數(shù)一般用來(lái)執(zhí)行一組特定的操作,一般不帶回函數(shù)值。
2)有參函數(shù)。在調(diào)用函數(shù)時(shí),主調(diào)函數(shù)通過(guò)參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù),一般情況下,被調(diào)用函數(shù)調(diào)用結(jié)束時(shí)會(huì)向主調(diào)函數(shù)返回一個(gè)函數(shù)值供主調(diào)函數(shù)使用。
在函數(shù)調(diào)用過(guò)程中,主調(diào)函數(shù)調(diào)用被調(diào)函數(shù)時(shí)通過(guò)參數(shù)傳遞的值通常有兩種:變量值或地址值;傳遞值的類型不同,結(jié)果截然不同。全面掌握形參和實(shí)參之間的數(shù)據(jù)傳遞,對(duì)分析函數(shù)的運(yùn)行是十分關(guān)鍵的。在c++中,實(shí)參向形參傳遞數(shù)據(jù)可以帶來(lái)兩種結(jié)果,即通過(guò)函數(shù)調(diào)用可以改變實(shí)參對(duì)應(yīng)存儲(chǔ)單元的值和不能改變實(shí)參對(duì)應(yīng)存儲(chǔ)單元的值。其基本的參數(shù)傳遞有三種不同的方式,即傳值、傳地址和傳遞引用。
2 C++中的函數(shù)參數(shù)傳遞的幾種方式
函數(shù)調(diào)用過(guò)程中的參數(shù)傳遞本質(zhì)上是一種賦值過(guò)程,即傳遞“值”的過(guò)程,在調(diào)用函數(shù)時(shí),函數(shù)的每個(gè)形式參數(shù)得到實(shí)際參數(shù)傳遞過(guò)來(lái)的一個(gè)“值”,該“值”可以是一個(gè)變量的值、一個(gè)變量的地址或是一個(gè)引用,“值”的類型不同結(jié)果也截然不同。下面舉例說(shuō)明函數(shù)調(diào)用時(shí)參數(shù)傳遞的幾種方式。
2.1單向傳值
當(dāng)實(shí)參是普通變量時(shí),函數(shù)形參為對(duì)應(yīng)類型的變量,函數(shù)發(fā)生調(diào)用時(shí),系統(tǒng)給形參分配存儲(chǔ)單元,存放從實(shí)參復(fù)制過(guò)來(lái)的數(shù)值。形參存儲(chǔ)單元在函數(shù)調(diào)用結(jié)束后當(dāng)即釋放,這種值傳遞是單向的,通過(guò)函數(shù)調(diào)用不會(huì)改變實(shí)參單元的值。
例1:
#include
void swap(int x,int y)
{int z;
z=x;
x=y;
y=z;
cout<<”the x, yn is:”<
}int main()
{int m,n;
Cin>>m>>n;
swap(m,n);
cout<<”the m, n is:”<
return 0 ;
}
例1中main函數(shù)在調(diào)用swap函數(shù)時(shí),把實(shí)參m,n的值傳給了形參x、y,假設(shè)程序運(yùn)行時(shí)輸入的m和n的值分別為10、20,在swap函數(shù)中x和y的值進(jìn)行了交換,而在主函數(shù)中實(shí)參m和n的值并沒(méi)有發(fā)生相應(yīng)的交互,即形參值的改變不能返回到實(shí)參中,因?yàn)閤和y是swap函數(shù)內(nèi)部定義的變量,屬于局部變量,調(diào)用函數(shù)時(shí),系統(tǒng)為其動(dòng)態(tài)分配存儲(chǔ)空間,調(diào)用結(jié)束后當(dāng)即被釋放,這種參數(shù)傳遞體現(xiàn)了傳值的單向性。調(diào)用過(guò)程如圖1所示。
圖1
2.2傳遞地址
若在函數(shù)定義時(shí)將形實(shí)參數(shù)類型說(shuō)明成指針或數(shù)組名,要調(diào)用這樣的函數(shù)相應(yīng)的實(shí)參就必須是地址值形式的實(shí)參,比如指針、變量的地址、數(shù)組名等。此時(shí)參數(shù)傳遞方式即為地址傳遞方式。這種傳遞地址的方式跟上述的按傳遞變量值不同,在調(diào)用過(guò)程中,把實(shí)參的內(nèi)容傳遞給形參,即使得實(shí)參和形參指向了同一個(gè)存儲(chǔ)單元,此時(shí)在函數(shù)調(diào)用過(guò)程中對(duì)形參的所有操作實(shí)際上同時(shí)是對(duì)實(shí)參的操作,因此,被調(diào)函數(shù)中形參指針?biāo)复鎯?chǔ)單元中內(nèi)容的改變都會(huì)影響到實(shí)參存儲(chǔ)單元。傳遞地址是實(shí)參和形參的形式有以下幾種:
1)實(shí)參為數(shù)組名,形參為指針
2)實(shí)參為數(shù)組名,形參為數(shù)組名3)實(shí)參為指針,形參為數(shù)組名4)實(shí)參為指針,形參為指針
說(shuō)明:數(shù)組名代表該數(shù)組首元素的地址,因此,用數(shù)組名作為函數(shù)的形參或?qū)崊r(shí),實(shí)際是對(duì)該數(shù)組的操作。實(shí)際上,C++編譯系統(tǒng)都是將形參數(shù)組名作為指針變量來(lái)處理。
例2:
#include
void fun(int a[2])
{ for(int i=0;i<2;i++)
a[i]=a[i]*a[i];}
void main(void)
{ int b[2]={2,4};
cout<
fun(b);
cout<
}
例2中通過(guò)函數(shù)調(diào)用,數(shù)組b和數(shù)組a占據(jù)同一段內(nèi)存,假設(shè)數(shù)組b首單元地址為2000H,a同樣為數(shù)組首地址,也是2000H.過(guò)程如所示。
2.3傳遞引用
定義引用就是給某一變量賦予一個(gè)別名,對(duì)引用的所有操作與對(duì)變量的操作完全一樣。因此引用不是定義新的變量,C++系統(tǒng)不會(huì)為引用類型變量分配內(nèi)存空間,這樣使用引用作為函數(shù)的形參不僅可以達(dá)到傳遞地址的目的,即通過(guò)形參的改變?nèi)ジ淖儗?shí)參的值,而且也會(huì)因?yàn)椴挥弥匦路峙淇臻g而節(jié)省系統(tǒng)的開(kāi)銷。
例3:
#include
void swap(int &x,int &y){
int z;
z=x; x=y; y=z;
cout<<"x="< } void main(){ int m,n; cin>>m>>n; swap(m,n); cout<<" m="<