c語言中函式引數傳遞的三種方式
(1)傳值,就是把你的變數的值傳遞給函式的形式引數,實際就是用變數的值來新生成乙個形式引數,因而在函式裡對形參的改變不會影響到函式外的變數的值。
(2)傳址,就是傳變數的位址賦給函式裡形式引數的指標,使指標指向真實的變數的位址,因為對指標所指位址的內容的改變能反映到函式外,也就是能改變函式外的變數的值。
(3)傳引用,實際是通過指標來實現的,能達到使用的效果如傳址,可是使用方式如傳值。
說幾點建議:如果傳值的話,會生成新的物件,花費時間和空間,而在退出函式的時候,又會銷毀該物件,花費時間和空間。
因而如果int,char等固有型別,而是你自己定義的類或結構等,都建議傳指標或引用,因為他們不會建立新的物件。
例1:下面這段**的輸出結果為:
#include
void change(int*a, int&b, int c)
int main ( )
結果:20 30 30
解析:該題考察函式傳參問題。
1,指標傳參 -> 將變數的位址直接傳入函式,函式中可以對其值進行修改。
2,引用傳參 -> 將變數的引用傳入函式,效果和指標相同,同樣函式中可以對其值進行修改。
3,值傳參 -> 在傳參過程中,首先將c的值複製給函式c變數,然後在函式中修改的即是函式的c變數,然後函式返回時,系統自動釋放變數c。而對main函式的c沒有影響。
例2:#include
void myswap(int x, int y)
int main()
#include
void myswap(int *p1, int *p2)
int main()
#include
void myswap(int &x, int &y)
int main()
第乙個的執行結果:輸入2 3,輸出2 3
第二個的執行結果:輸入2 3,輸出3 2
第三個的執行結果:輸入2 3,輸出3 2
解析:在第乙個程式中,傳值不成功的原因是指在形參上改變了數值,沒有在實參上改變量值。
在第二個程式中,傳位址成功的原因利用指標改變了原來的位址,所以實參就交換了。
在第三個程式中,引用是直接改變兩個實參變數a,b的值,所以就交換了。
下文會通過例子詳細說明關於值傳遞,指標傳遞,引用傳遞
1)值傳遞:
形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的(實參->形參),引數的值只能傳入,
不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。
2)指標傳遞:
形參為指向實參位址的指標,當對形參的指向操作時,就相當於對實參本身進行的操作
3)引用傳遞:
形參相當於是實參的「別名」,對形參的操作其實就是對實參的操作,在引用傳遞過程中,被調函式的形式引數雖然也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址。被調函式對形參的任何操作都被處理成間接定址,即通過棧中存放的位址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。
下面的**對此作出了細緻解釋(從實參,形參在記憶體中存放位址的角度 說明了問題的本質,容易理解 )
1 #include2 using namespace std;
3 //值傳遞
4 void change1(int n)
使用引用機制後,以上程式的c++版本為:
void swapint(int &a,int &b)
2、給函式傳遞大型物件
當大型物件被傳遞給函式時,使用引用引數可使引數傳遞效率得到提高,因為引用並不產生物件的
副本,也就是引數傳遞時,物件無須複製。下面的例子定義了乙個有限整數集合的類:
const maxcard=100;
class set
//建構函式
friend set operator * (set ,set ) ; //過載運算符號*,用於計算集合的交集 用物件作為傳值引數
// friend set operator * (set & ,set & ) 過載運算符號*,用於計算集合的交集 用物件的引用作為傳值引數
...}
先考慮集合交集的實現
set operator *( set set1,set set2)
return res;
}由於過載運算子不能對指標單獨操作,我們必須把運算數宣告為 set 型別而不是 set * 。
每次使用*做交集運算時,整個集合都被複製,這樣效率很低。我們可以用引用來避免這種情況。
set operator *( set &set1,set &set2)
return res;
}三、引用返回值
如果乙個函式返回了引用,那麼該函式的呼叫也可以被賦值。這裡有一函式,它擁有兩個引用引數並返回乙個雙精度數的引用:
double &max(double &d1,double &d2)
由於max()函式返回乙個對雙精度數的引用,那麼我們就可以用max() 來對其中較大的雙精度數加1:
max(x,y)+=1.0;
C語言中函式引數傳遞的三種方式
煙台大學計算機與控制工程學院 檔名稱 test.cpp 作 者 朱國榮 完成日期 2015年9月11日 版 本 號 vc6.0 問題描述 交換a和b的值。輸入描述 兩個整數,分別為2和3。程式輸出 交換後的兩個數,輸出3和2.include void myswap int p1,int p2 2 引...
C語言中函式引數傳遞的三種方式 x, x, x
includevoid myswap1 int x,int y void myswap2 int p1,int p2 void myswap3 int x,int y intmain 在第乙個程式中,傳值不成功的原因是指在形參上改變了數值,沒有在實參上改變量值。在第二個程式中,傳位址成功的原因利用指...
C C 語言中函式引數傳遞的三種方式
問題及 檔名稱 cpp1.cpp 完成日期 2015年12月7日 版本號 v6.0 問題描述 c語言中函式引數傳遞的三種方式 輸入描述 兩個待交換的整數 程式輸出 交換後得兩個整數 includevoid myswap int x,int y int main includevoid myswap ...