[語法] 函式的指標(*)與參考(&)

看板C_and_CPP (C/C++)作者時間15年前 (2010/09/02 17:02), 編輯推噓4(4014)
留言18則, 5人參與, 最新討論串1/1
最近研究指標,有點頭昏腦脹,想來請教一下。 一般變數的指標(*)與參考(&)間的關係比較好理解, 但是中間若又多了個函式來傳遞就很混亂, 曾看過下表: 傳遞方式 空間使用 執行效率 資料安全 語法容易 傳數值 劣 劣 優 優 傳指標 優 優 優 劣 傳參考 優 優 優 優 傳參考的語法容易? 請問下列6個 max 函式後我寫的註解是對的嗎? max5 與 max6 我想取得其最大值的位址該如何做呢? 這個max函式還有其他方式可以拼湊出不同的 * 及 & 的位置嗎? 多謝各位。 ///////////////////////////////////////////////////////////////// #include <iostream> using namespace std; int *max1( int *p, int *q) //傳指標 {return ( *p > *q ? p: q);} int *max2( int &p, int &q) //傳指標 {return ( p > q ? &p : &q);} int &max3( int *p , int *q) //與max2相反?傳參考? {return ( *p > *q ? *p : *q );} int &max4( int &p, int &q) //傳參考 {return ( p > q ? p : q );} int max5( int *p, int *q) //傳指標,與max3的差別是? {return ( *p > *q ? *p: *q);} int max6( int p , int q) //傳值 {return ( p > q ? p : q );} main() { int a=3; int b=5; cout << "&a=" << &a << endl; cout << "&b=" << &b << endl << endl; cout << "max1 = "<<*max1(&a,&b)<< " " << max1(&a,&b) << endl << endl; cout << "max2 = "<<*max2(a,b) << " " << max2(a,b) << endl << endl; cout << "max3 = "<< max3(&a,&b)<< " " << &max3(&a,&b) << endl << endl; cout << "max4 = "<< max4(a,b) << " " << &max4(a,b) << endl << endl; cout << "max5 = "<< max5(&a,&b)<< " " << endl << endl;//不能取max值的位值 cout << "max6 = "<< max6(a,b) << " " << endl << endl;//不能取max值的位值 system("pause"); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.85.141.201

09/02 17:03, , 1F
1.指 2.參 3.指 4.參 5.指 6.值
09/02 17:03, 1F

09/02 17:05, , 2F
回傳: 1.指 2.指 3.參 4.參 5.值 6.值
09/02 17:05, 2F

09/02 17:07, , 3F
還有接受 "參考", 回傳 "值" 的版本
09/02 17:07, 3F

09/02 17:09, , 4F
請教:回傳值不是要跟定義函式一樣嗎?
09/02 17:09, 4F

09/02 17:11, , 5F
有些不是 int& max,但是 return int
09/02 17:11, 5F

09/02 17:13, , 6F
妳不要被&給迷惑 它return int 然後用 int&去接 代表他
09/02 17:13, 6F

09/02 17:13, , 7F
是將那個東西 reference 方式傳回來
09/02 17:13, 7F

09/02 17:14, , 8F
其實很好分 要接的是int*就是指標 是int&就是參考
09/02 17:14, 8F

09/02 17:15, , 9F
int就是拷貝一份值
09/02 17:15, 9F

09/02 17:15, , 10F
除了定義, 我都習慣把 * 跟 & 跟型態寫在一起, 像是
09/02 17:15, 10F

09/02 17:16, , 11F
int& max( ... );
09/02 17:16, 11F

09/02 17:40, , 12F
再請教:為何不能取 &max5 及 &max6?他們沒有位址嗎?
09/02 17:40, 12F

09/02 17:41, , 13F
5, 6 應該是回傳 Rvalue?
09/02 17:41, 13F

09/02 17:56, , 14F
另,我有點不清楚return值是看哪?max前,還是return那
09/02 17:56, 14F

09/02 17:58, , 15F
因為max3與max5只差在max前的定義,而回傳 3.參 5.值?
09/02 17:58, 15F

09/02 18:02, , 16F
return是看max之前
09/02 18:02, 16F

09/03 14:45, , 17F
反正這麼短的函式都會被最佳化幹掉 所以沒差啦...lol
09/03 14:45, 17F

09/03 14:46, , 18F
另外對基本型態來說 傳值的效率比傳ptr/ref好多了@@
09/03 14:46, 18F
文章代碼(AID): #1CVsWMZ_ (C_and_CPP)
文章代碼(AID): #1CVsWMZ_ (C_and_CPP)