孫勤
摘要:在C+ +程序設(shè)計函數(shù)調(diào)用過程中,函數(shù)參數(shù)的傳遞是至關(guān)重要的內(nèi)容,參數(shù)傳遞的方式不同,其傳遞的內(nèi)容也不同類型,在程序設(shè)計過程中,選擇恰當(dāng)?shù)膮?shù)傳遞方式,不僅可以使程序更加簡潔,同時可以提供程序的運(yùn)行效率,該文較為全面的論述了C++中函數(shù)參數(shù)傳遞的幾種常見方式以及各種方式的優(yōu)點(diǎn)及區(qū)別。
關(guān)鍵詞:C++;函數(shù)調(diào)用;參數(shù)傳遞
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號: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++語言是在C語言的基礎(chǔ)上擴(kuò)充了面向?qū)ο蟮母拍詈拖鄳?yīng)的處理機(jī)制而形成的一種混合型的程序設(shè)計語言,C++全面兼容C。在一個C/C++程序中,為避免主函數(shù)龐雜、頭緒不清,閱讀和維護(hù)困難,經(jīng)常用模塊化程序設(shè)計的思路,采用“組裝”的辦法簡化程序設(shè)計的過程,即事先編好一批實現(xiàn)各種不同功能的函數(shù),把它們保存在函數(shù)庫中,需要時直接用。C/C++程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成,主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。在程序設(shè)計中善于利用函數(shù),可以減少重復(fù)編寫程序段的工作量,同時可以方便地實現(xiàn)模塊化的程序設(shè)計。
1 C++中的函數(shù)
從用戶使用的角度看,函數(shù)有兩種,一是庫函數(shù),它是由系統(tǒng)提供的;二是用戶自己定義的函數(shù),它是用以解決用戶專門需要的函數(shù)。
從函數(shù)的形式看,函數(shù)分兩類。
1)無參函數(shù)。無參函數(shù)一般用來執(zhí)行一組特定的操作,一般不帶回函數(shù)值。
2)有參函數(shù)。在調(diào)用函數(shù)時,主調(diào)函數(shù)通過參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù),一般情況下,被調(diào)用函數(shù)調(diào)用結(jié)束時會向主調(diào)函數(shù)返回一個函數(shù)值供主調(diào)函數(shù)使用。
在函數(shù)調(diào)用過程中,主調(diào)函數(shù)調(diào)用被調(diào)函數(shù)時通過參數(shù)傳遞的值通常有兩種:變量值或地址值;傳遞值的類型不同,結(jié)果截然不同。全面掌握形參和實參之間的數(shù)據(jù)傳遞,對分析函數(shù)的運(yùn)行是十分關(guān)鍵的。在c++中,實參向形參傳遞數(shù)據(jù)可以帶來兩種結(jié)果,即通過函數(shù)調(diào)用可以改變實參對應(yīng)存儲單元的值和不能改變實參對應(yīng)存儲單元的值。其基本的參數(shù)傳遞有三種不同的方式,即傳值、傳地址和傳遞引用。
2 C++中的函數(shù)參數(shù)傳遞的幾種方式
函數(shù)調(diào)用過程中的參數(shù)傳遞本質(zhì)上是一種賦值過程,即傳遞“值”的過程,在調(diào)用函數(shù)時,函數(shù)的每個形式參數(shù)得到實際參數(shù)傳遞過來的一個“值”,該“值”可以是一個變量的值、一個變量的地址或是一個引用,“值”的類型不同結(jié)果也截然不同。下面舉例說明函數(shù)調(diào)用時參數(shù)傳遞的幾種方式。
2.1單向傳值
當(dāng)實參是普通變量時,函數(shù)形參為對應(yīng)類型的變量,函數(shù)發(fā)生調(diào)用時,系統(tǒng)給形參分配存儲單元,存放從實參復(fù)制過來的數(shù)值。形參存儲單元在函數(shù)調(diào)用結(jié)束后當(dāng)即釋放,這種值傳遞是單向的,通過函數(shù)調(diào)用不會改變實參單元的值。
例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ù)時,把實參m,n的值傳給了形參x、y,假設(shè)程序運(yùn)行時輸入的m和n的值分別為10、20,在swap函數(shù)中x和y的值進(jìn)行了交換,而在主函數(shù)中實參m和n的值并沒有發(fā)生相應(yīng)的交互,即形參值的改變不能返回到實參中,因為x和y是swap函數(shù)內(nèi)部定義的變量,屬于局部變量,調(diào)用函數(shù)時,系統(tǒng)為其動態(tài)分配存儲空間,調(diào)用結(jié)束后當(dāng)即被釋放,這種參數(shù)傳遞體現(xiàn)了傳值的單向性。調(diào)用過程如圖1所示。 圖1 2.2傳遞地址 若在函數(shù)定義時將形實參數(shù)類型說明成指針或數(shù)組名,要調(diào)用這樣的函數(shù)相應(yīng)的實參就必須是地址值形式的實參,比如指針、變量的地址、數(shù)組名等。此時參數(shù)傳遞方式即為地址傳遞方式。這種傳遞地址的方式跟上述的按傳遞變量值不同,在調(diào)用過程中,把實參的內(nèi)容傳遞給形參,即使得實參和形參指向了同一個存儲單元,此時在函數(shù)調(diào)用過程中對形參的所有操作實際上同時是對實參的操作,因此,被調(diào)函數(shù)中形參指針?biāo)复鎯卧袃?nèi)容的改變都會影響到實參存儲單元。傳遞地址是實參和形參的形式有以下幾種:
1)實參為數(shù)組名,形參為指針
2)實參為數(shù)組名,形參為數(shù)組名3)實參為指針,形參為數(shù)組名4)實參為指針,形參為指針
說明:數(shù)組名代表該數(shù)組首元素的地址,因此,用數(shù)組名作為函數(shù)的形參或?qū)崊r,實際是對該數(shù)組的操作。實際上,C++編譯系統(tǒng)都是將形參數(shù)組名作為指針變量來處理。
例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中通過函數(shù)調(diào)用,數(shù)組b和數(shù)組a占據(jù)同一段內(nèi)存,假設(shè)數(shù)組b首單元地址為2000H,a同樣為數(shù)組首地址,也是2000H.過程如所示。
2.3傳遞引用
定義引用就是給某一變量賦予一個別名,對引用的所有操作與對變量的操作完全一樣。因此引用不是定義新的變量,C++系統(tǒng)不會為引用類型變量分配內(nèi)存空間,這樣使用引用作為函數(shù)的形參不僅可以達(dá)到傳遞地址的目的,即通過形參的改變?nèi)ジ淖儗崊⒌闹?,而且也會因為不用重新分配空間而節(jié)省系統(tǒng)的開銷。
例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="< } 調(diào)用函數(shù)“swap(m,n);”時,實參m與形參x結(jié)合,使x成為實參m的別名,y成為實參n的別名,此時的x和m、y和n實際是同一存儲單元的兩個不同的名稱,因此函數(shù)中對形參x,y的操作就是對實參m,n的操作。從而實現(xiàn)了通過引用作為形參去改變實參值的目的。 當(dāng)然在使用引用時不想通過形參去改變實參的值,即保護(hù)實參的值不被有意或無意的破壞,可以在定義的時候把形參說明為常量引用,如: Void f1 ( const int & x, const float y) 在函數(shù)f1被調(diào)用時,只能讀取引用形參x和y的值,而不能夠修改它們對應(yīng)實參的值。 3結(jié)束語 通過以上論述及對比可以發(fā)現(xiàn),在C++的程序設(shè)計過程中,函數(shù)調(diào)用是非常關(guān)鍵且時常發(fā)生的操作,正確選用函數(shù)參數(shù)的傳遞方式尤為重要。 參考文獻(xiàn): [1]陸偉.C++引用的使用探討[J].科技廣場,2010(5). [2]錢能.C++程序設(shè)計教程[M].北京:清華大學(xué)出版社,2009. [3]溫秀梅,丁學(xué)鈞.Visual c++面向?qū)ο蟪绦蛟O(shè)計教程與實驗[M]. 2版.北京:清華大學(xué)出版社,2005. [4]譚浩強(qiáng).C程序設(shè)計[M].4版.北京:清華大學(xué)出版社,2010.