您好,登錄后才能下訂單哦!
C/C++函數(shù)參數(shù)傳遞機(jī)制詳解及實(shí)例
概要:
C/C++的基本參數(shù)傳遞機(jī)制有兩種:值傳遞和引用傳遞,我們分別來看一下這兩種的區(qū)別。
(1)值傳遞過程中,需在堆棧中開辟內(nèi)存空間以存放由主調(diào)函數(shù)放進(jìn)來的實(shí)參的值,從而成為了實(shí)參的一個副本。值傳遞的特點(diǎn)是被調(diào)函數(shù)對形參的任何操作都是作為局部變量進(jìn)行,不會影響主調(diào)函數(shù)的實(shí)參變量的值。
(2)引用傳遞過程中,被調(diào)函數(shù)的形參雖然也作為局部變量在堆棧中開辟了內(nèi)存空間,但是這時存放的是由主調(diào)函數(shù)放進(jìn)來的實(shí)參變量的地址。被調(diào)函數(shù)對形參的任何操作都被處理成間接尋址,即通過堆棧中存放的地址訪問主調(diào)函數(shù)中的實(shí)參變量。正因為如此,被調(diào)函數(shù)對形參做的任何操作都影響了主調(diào)函數(shù)中的實(shí)參變量。
下面我們來看一個示例。
/* *測試函數(shù)參數(shù)傳遞機(jī)制 */ class CRect { public: int height; int widht; CRect() { height = 0; widht = 0; } CRect(int height, int widht) { this->height = height; this->widht = widht; } }; //(1)傳址調(diào)用(傳指針) 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)傳值調(diào)用 int RectArea(CRect rect) { int result = rect.height * rect.widht; rect.height = 40; return result; }
看一下我們的測試代碼和測試結(jié)果。
//測試代碼邏輯 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; } //測試結(jié)果 面積:100 面積:200 rect.height:30 面積:300 rect.height:30
可以發(fā)現(xiàn)傳址調(diào)用和引用傳遞兩種方式,當(dāng)改變形參的值時,同時也會將實(shí)參的值改變,而傳值調(diào)用改變形參則對實(shí)參沒有任何影響。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。