C/C++函數參數傳遞機制詳解及實例。本站提示廣大學習愛好者:(C/C++函數參數傳遞機制詳解及實例)文章只能為提供參考,不一定能成為您想要的結果。以下是C/C++函數參數傳遞機制詳解及實例正文
C/C++函數參數傳遞機制詳解及實例
概要:
C/C++的基本參數傳遞機制有兩種:值傳遞和引用傳遞,我們分別來看一下這兩種的區別。
(1)值傳遞過程中,需在堆棧中開辟內存空間以存放由主調函數放進來的實參的值,從而成為了實參的一個副本。值傳遞的特點是被調函數對形參的任何操作都是作為局部變量進行,不會影響主調函數的實參變量的值。
(2)引用傳遞過程中,被調函數的形參雖然也作為局部變量在堆棧中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操作都被處理成間接尋址,即通過堆棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。
下面我們來看一個示例。
/*
*測試函數參數傳遞機制
*/
class CRect {
public:
int height;
int widht;
CRect() {
height = 0;
widht = 0;
}
CRect(int height, int widht) {
this->height = height;
this->widht = widht;
}
};
//(1)傳址調用(傳指針)
int RectAreaPoint(CRect *rect) {
int result = rect->height * rect->widht;
rect->height = 20;
return result;
}
//(2)引用傳遞
int RectAreaRefer(CRect &rect) {
int result = rect.height * rect.widht;
rect.height = 30;
return result;
}
//(3)傳值調用
int RectArea(CRect rect) {
int result = rect.height * rect.widht;
rect.height = 40;
return result;
}
看一下我們的測試代碼和測試結果。
//測試代碼邏輯
void testPoint() {
CRect rect(10, 10);
cout << "面積:" << RectAreaPoint(&rect) << endl;
cout << "面積:" << RectAreaRefer(rect) << endl;
cout << "rect.height:" << rect.height << endl;
cout << "面積:" << RectArea(rect) << endl;
cout << "rect.height:" << rect.height << endl;
}
//測試結果
面積:100
面積:200
rect.height:30
面積:300
rect.height:30
可以發現傳址調用和引用傳遞兩種方式,當改變形參的值時,同時也會將實參的值改變,而傳值調用改變形參則對實參沒有任何影響。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!