線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1854
推到 Plurk!
推到 Facebook!

看不懂書中範例

答題得分者是:wjhsu
theonetw
一般會員


發表:3
回覆:7
積分:2
註冊:2008-06-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-09 08:05:28 IP:118.161.xxx.xxx 訂閱
請問各位大大,以下是書中的範例,講的是"參考"函式
但是不懂它的意義為何?在函式前加"&"有什麼作用?
而且後來我將函式前的"&"拿掉後重新執行結果還是一樣啊,所以我看不出有沒有加&的差別
請知道的人告訴我一下,感謝

[code cpp]
//---------------------------------------------------------------------------
#include
#include <math.h><br />#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int &fun(int);
int y;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
int x=2,a;
a=fun(2);
Label1->Caption =IntToStr(a);
}
//---------------------------------------------------------------------------
int &fun(int x)
{
y=3*pow(x,2)-2*x 1;
return (y);
}

[/code]
hipig
高階會員


發表:31
回覆:75
積分:111
註冊:2007-01-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-10 02:57:33 IP:140.126.xxx.xxx 未訂閱
你寫int x=2,a = 0;
執行出來就可能不同了

簡單的說
是指標
讓你的函數可以更改傳入值也可以正確的傳出
建議你可以去找一本書叫"最新C語言實例詳解"
日本人寫的
這一部份有非常淺顯易懂的說明
編輯記錄
hipig 重新編輯於 2008-07-10 02:59:31, 註解 無‧
theonetw
一般會員


發表:3
回覆:7
積分:2
註冊:2008-06-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-10 08:22:13 IP:118.161.xxx.xxx 訂閱
謝謝你的建議
不過,執行結果還是一樣也


===================引 用 hipig 文 章===================
你寫int x=2,a = 0;
執行出來就可能不同了

簡單的說
是指標
讓你的函數可以更改傳入值也可以正確的傳出
建議你可以去找一本書叫"最新C語言實例詳解"
日本人寫的
這一部份有非常淺顯易懂的說明
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-07-10 09:30:55 IP:203.70.xxx.xxx 未訂閱
請先參考這一篇,
http://delphi.ktop.com.tw/board.php?cid=168&fid=1499&tid=91051

何謂Call By Value? Call By Reference? Call By Address?

以下程式碼, 提供你參考...

請觀察一下記憶體配置的位址有何差異?

[code cpp]
//---------------------------------------------------------------------------
int& TForm1::func(int x)
{
AnsiString S;
int ret = (int)x 1;
int &y = ret;

ListBox1->Items->Add(S.sprintf("Value of ret = %d",ret));
ListBox1->Items->Add(S.sprintf("Address of ret = %p",&ret));
ListBox1->Items->Add(S.sprintf("Value of y = %d",y));
ListBox1->Items->Add(S.sprintf("Address of y = %p",&y));
return y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int &RefA = func(1);
int ValA = RefA;
AnsiString S;
ListBox1->Items->Add(S.sprintf("Value of RefA = %d",RefA));
ListBox1->Items->Add(S.sprintf("Address of RefA = %p",&RefA));
ListBox1->Items->Add(S.sprintf("Value of ValueA = %d",ValA));
ListBox1->Items->Add(S.sprintf("Address of ValueA = %p",&ValA));
}
//---------------------------------------------------------------------------
[/code]
wjhsu
初階會員


發表:9
回覆:32
積分:48
註冊:2004-06-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-07-10 09:51:14 IP:61.219.xxx.xxx 訂閱
我覺得, 因為你把y宣告為全域變數, 所以不容易看出它們的區別, 
印象中, 對"參考"的解釋簡單地說就是 "把它看成被參考的變數",
另外與其它函式不同的是, 可以將傳回參考的函式放在等號左邊...

1. int fun(int) -->表示將y值計算後, 複製它的值, 然後傳回
2. int &fun(int)-->表示傳回y本身 (前提是因為你的y宣告為全域變數才可)

3. 如果將y宣告在int fun(int)裏, 則結果相同, 但如果宣告在 int &fun(int)裏,
則 compile時就會出錯, 因為函式裏的local 變數在函式結束後就消失了,
所以無法傳回y本身

4. 如果fun()宣告為 int &fun(int), 則下列的敍述是合法的()

a = fun(2) ==> 進入fun(2)計算後 y=9, 然後傳回y , 再把y複製給a , 所以 y=9, a=9
fun(2)=101 ==> 進入fun(2)計算後 y=9, 傳回y之後把101複製給y, 所以y最後為101
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-07-10 10:00:14 IP:203.70.xxx.xxx 未訂閱
執行結果(不同電腦,位址會有差異)

Value of ret = 2
Address of ret = 0012F53C

Value of y = 2
Address of y = 0012F53C

Value of RefA = 2
Address of RefA = 0012F53C

Value of ValueA = 2
Address of ValueA = 0012F58C

動作說明:
(1)int ret = (int)x 1;
(int)x 1 運算後, 返回值放置在新配置的 int 變數 ret 中.
此時, ret 在記憶體中佔據 4bytes空間, 並有內含值(此例為 2)

(2)int &y = ret;
y 被宣告成 變數 ret 的參考, 在程式中雖然有不同變數名稱
其實 y 與 ret 佔有同一個記憶體空間, 當然有相同內含值.

(3)int &RefA = func(1);
RefA 也是宣告為某 int 變數的參考, 此例中用來承接 func()傳迴值
在記憶體所在的參考, 因此 RefA 如同 y 一樣, 同為 ret 的一個參考
佔有同一個記憶體空間, 當然有相同內含值.

(4)int ValA = RefA;
ValA 是一個新宣告的變數, 因此佔據不同的記憶體位址, 此例中用來
承接 RefA 的內含值.

(5)若 func() 中改為 int &y = (int)x 1;
則 y 所參考的是不具變數名稱的一個記憶體位址...

個人見解,謹供參考....

編輯記錄
jow 重新編輯於 2008-07-10 10:05:44, 註解 無‧
jow 重新編輯於 2008-07-10 10:08:32, 註解 無‧
theonetw
一般會員


發表:3
回覆:7
積分:2
註冊:2008-06-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-07-10 19:49:44 IP:118.161.xxx.xxx 訂閱
感謝您的教導~~~


===================引 用 wjhsu 文 章===================
我覺得, 因為你把y宣告為全域變數, 所以不容易看出它們的區別,
印象中, 對"參考"的解釋簡單地說就是 "把它看成被參考的變數",
另外與其它函式不同的是, 可以將傳回參考的函式放在等號左邊...

1. int fun(int) -->表示將y值計算後, 複製它的值, 然後傳回
2. int &fun(int)-->表示傳回y本身 (前提是因為你的y宣告為全域變數才可)

3. 如果將y宣告在int fun(int)裏, 則結果相同, 但如果宣告在 int &fun(int)裏,
則 compile時就會出錯, 因為函式裏的local 變數在函式結束後就消失了,
所以無法傳回y本身

4. 如果fun()宣告為 int &fun(int), 則下列的敍述是合法的()

a = fun(2) ==> 進入fun(2)計算後 y=9, 然後傳回y , 再把y複製給a , 所以 y=9, a=9
fun(2)=101 ==> 進入fun(2)計算後 y=9, 傳回y之後把101複製給y, 所以y最後為101
系統時間:2024-04-20 10:49:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!