看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《xshane831 (Shane)》之銘言: : 應該是基本的觀念問題,但我沒學好.. : 就是為何函式傳參數進去但沒有改變原始的值 : void dd(int x); : int main() : { : int yes=0; : dd(yes); : cout<<yes; : return 0; : } : void dd(int x) : { : x=50+50; : } 你是把value傳進去給他, 進入function時其實是把新宣告的變數push進stack, 在stack中修改你宣告的value, 當然在出function後就不見了,因為你是修改在stack裡面而不是原本的位置。 兩種解法: 1. 利用pointer 傳address給他,利用pointer來修改傳進去address的memory值 void dd(int *x); int main() { int yes = 0; dd(&yes); cout << yes; return 0; } void dd(int *x) { *x = 50 + 50; } 2. 利用return 對pointer不熟的話,只要一個output的function可以用這種方法 int dd(int x); int main() { int yes = 0; yes = dd(yes); cout << yes; return 0; } int dd(int x) { x = 50 + 50; return x; } : 我認為最後yes應該要是100,但還是0,有改寫成 : void(int x, int y) : { : x=50+50 : y=x; : } : 並在main裡用另一個值yes2當第二個參數傳入,最終也沒改變 : 雖然改成int dd(int x)可以 : 而如果函式傳兩個以上參數且都需要回傳,改成return陣列也可以 : 但想知道為何不會改變原始傳進去的值,如: yes : 但用一些library,類似OpenCV,類似void cvSmooth(src, dst...) 就可 : 請問是為什麼? 我哪邊的觀念卡住了? 有可能你用的function也是吃value而已 但是查了一下cvSmooth void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype, int param1, int param2, double param3, double param4 ); 後面5個parameter都是吃value沒錯, 但前面兩個CvArr type都是pointer 可能你前面有段code是 CvArr *src, *dst; 再透過某些openCV的function拿到pointer, 為了要傳pointer進去所以就打 cvSmooth( src, dst, ... 你傳進去的其實是"src"本身的"address",為4bytes, 那塊記憶體上的資料的是指向"*src"這個data的address, 也就是指向這個data位置的pointer : 感恩! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.245.128 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1395782155.A.D48.html ※ 編輯: q82419 來自: 140.112.245.128 (03/26 05:16) ※ 編輯: q82419 來自: 140.112.245.128 (03/26 05:22)
CaptainH:這仍然是pass by value ( of address ) 03/26 09:00
CaptainH:pass-by-reference 通常指 C++ 的 reference 03/26 09:01
感謝指正 ※ 編輯: q82419 來自: 140.112.245.128 (03/26 11:40)
xshane831:謝謝 講解得很詳細! 03/26 13:19