作者q82419 (q82419)
看板C_and_CPP
標題Re: [問題] function的問題
時間Wed Mar 26 05:15:52 2014
※ 引述《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