C/C++中函數傳參方式簡述

提到函數傳參,必然就會面對“傳值”和“傳址”問題,C++中還會涉及到“傳引用”。

C語言中所有傳遞給函數的參數都是傳值方式進行的,也就是說“傳值”和“傳址”本質上是相同的,執行函數調用時都是將主調函數實參的副本壓棧,因此被調用函數中對形參的操作實際上只作用於這個實參副本之上,不影響實參。(“傳址”也就是形參爲指針時,由於形參和實參都是地址,它們指向同一內存區域,因此通過指針解引用可以影響到實參)

C++中的“傳引用”方式,是真正的“以地址的方式傳遞參數”。函數調用時,被調函數的形式參數雖然也作爲局部變量在堆棧中開闢了內存空間,壓棧的是引用的副本, 這裏的引用實際上也是指向實參的指針。在被調函數內部訪問形參變量時,大多數情況下與“傳址”一樣,採用間接尋址方式;但編譯器在實現的時候可以對“傳引用”進行優化,使其採用直接尋址方式。所以可以得到下面的結論:

引用傳遞和指針傳遞的效率上比,引用傳遞的效率始終不低於指針傳遞。

這裏貼一段海的來信博客裏面的一段話作爲總結:

傳遞引用與傳指針、傳值的區別?

(1)傳遞引用給函數與傳遞指針的效果是一樣的。這時,被調函數的形參就成爲原來主調函數中的實參變量或對象的一個別名來使用,所以在被調函數中對形參變量的操作就是對其相應的目標對象(在主調函數中)的操作。

(2)使用引用傳遞函數的參數,在內存中並沒有產生實參的副本,它是直接對實參操作;而使用一般變量傳遞函數的參數,當發生函數調用時,需要給形參分配存儲單元,形參變量是實參變量的副本;如果傳遞的是對象,還將調用拷貝構造函數。因此,當參數傳遞的數據較大時,用引用比用一般變量傳遞參數的效率和所佔空間都好。

(3)使用指針作爲函數的參數雖然也能達到與使用引用的效果,但是,在被調函數中同樣要給形參分配存儲單元,且需要重複使用”*指針變量名”的解指針操作進行運算,這很容易產生錯誤且程序的閱讀性較差;另一方面,在主調函數的調用點處,必須用變量的地址作爲實參。而引用更容易使用,更清晰。

參考資料:
函數傳值 傳地址 傳引用的區別【轉】(推薦閱讀)
傳值和傳引用、傳指針的區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章