轉載一篇好文章,小修改了下,2011年新寫的,強大~
http://kecheng0927.blog.163.com/blog/static/116414616201109103916943/
在各種語言中,輸入參數傳遞方法(地址傳遞、值傳遞)各有不同。如:
VB :默認爲地址傳遞,可以指定用值傳遞
C: 普通方式實現值傳遞,指針方式實現地址傳遞
C++:比 C 多了引用傳遞,本質上是地址傳遞
Fortran: 默認爲地址傳遞,可以指定使用值傳遞
兩種傳遞方式的區別:
1. 用地址傳遞方式可以在函數內部修改傳入的參數值,而值傳遞不可以。
2. 值傳遞需要對輸入的參數進行拷貝,複雜的數據結構值傳遞時會降低程序執行的效率。
那麼MATLAB的函數參數究竟用哪一種方式呢?
查看幫助文檔得到結果:如果函數內部試圖修改輸入參數的值則爲值傳遞,如果沒有修改則爲地址傳遞。
採用這一處理方式的目的是:
1. 不允許函數內部修改輸入參數的值
2. 兼顧執行效率(地址傳遞不需要將輸入參數拷貝一份)
那麼我們可不可以去驗證一下呢?
首先我們需要藉助一個mex函數,該函數的功能就是改變輸入參數的數值,由於該函數是藉助mex方式實現的,所以MATLAB無法檢測到我們修改了輸入參數的值。
以下是該mex函數的代碼:mexChangeValue.cpp
然後開始做實驗:
我們可以看到輸出結果爲:
0
1.2000
a 的值沒有改變,而 b 的值被改變了,說明在 fun1 中 "a = 3;" 之後,對輸入參數 a 做了一份拷貝,變爲“值傳遞”,而在 fun2 中剛開始進入函數時是“地址傳遞”的。
結論:
1. 在改變輸入參數的值之前是“地址傳遞”的,在改變輸入參數的值之後變爲“值傳遞”。
2. 我們在編寫函數時,儘量不要對輸入參數重新賦值,尤其是對複雜的數據,這樣會降低執行效率。