全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:865
推到 Plurk!
推到 Facebook!

關於函式指標ㄉ問題

尚未結案
Sarick
一般會員


發表:14
回覆:19
積分:6
註冊:2004-01-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-27 23:55:10 IP:218.174.xxx.xxx 未訂閱
小弟有一個關於函式指標ㄉ問題想請教各位前輩.... void func1(void); void func2(void); void func3(void); void func3(void); Typedef void (*fewfunc)(void); const fewfunc[2][2] = { { func1, func2 } { func3, func4 } } 做完上面ㄉ宣告,小弟可以像下面這樣呼叫函式ㄇ ?? (fewfunc[1][1])();//呼叫func1 感謝各位前輩指教...
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-28 00:51:22 IP:211.76.xxx.xxx 未訂閱
Sarick 您好:    基本上您的觀念是對的,不過陣列的索引是從零開始,所以您的數值有點不正確。 不好意思,為了方便說明,改寫您的程式碼。運算子優先順序可參考線上說明。  
//---------------------------------------------------------------------------
void func00(void) { ShowMessage("func00"); }
void func01(void) { ShowMessage("func01"); }
void func10(void) { ShowMessage("func10"); }
void func11(void) { ShowMessage("func11"); }    typedef void (*pfunc)(void);    const pfunc fewfunc[2][2] =
{ { func00, func01 },
  { func10, func11 }
};    void __fastcall TForm1::Button1Click(TObject *Sender)
{
  fewfunc[0][0]();     // []的優先順序與()相同,但先左後右
  ( fewfunc[1][0] )(); // 避免混淆可加括號()
  ShowMessage( IntToHex((__int64)(&fewfunc[1][0]), 4) ); // 將函數位址當成數值看待。
  ( &(*fewfunc[1][1]) )();  // []的優先順序高於*;
}
//--------------------------------------------------------------------------- 
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-28 09:30:57 IP:220.135.xxx.xxx 未訂閱
請問richtop大大
引言:
( &(*fewfunc[1][1]) )();  // []的優先順序高於*;
這個是什麼意思?為什麼執行起來跟
(fewfunc[1][1])();
(*fewfunc[1][1])();
(*(&fewfunc[1][1]))();
效果都一樣?對於指標函數還真是覺得有點奇怪? 跟一般的指標變數的差異性在哪呢?感激...
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-28 09:40:12 IP:210.243.xxx.xxx 未訂閱
引言: ShowMessage( IntToHex((__int64)(&fewfunc[1][0]), 4) ); // 將函數位址當成數值看待。
用這個來看位置,更是奇怪?
ShowMessage( IntToHex((__int64)(&fewfunc[1][0]), 4) ); => 403308
ShowMessage( IntToHex((__int64)(fewfunc[1][0]), 4) );  => 401818
ShowMessage( IntToHex((__int64)(*fewfunc[1][0]), 4) ); => 401818
請問這三個分別代表什麼?感激!
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-28 11:31:27 IP:211.76.xxx.xxx 未訂閱
hornacek 您好: 因為寫的時候太晚了(應該說太"早"了),所以有點神智不清,多寫了一些東西,模糊了焦點,把大家弄混了! 底下的說法比較白話,如果有更學術性的用語與說法,請各位提供,謝謝! <>*(指標變數):會取得該指標變數所存位址裡的值。 (函式指標)<>():會執行該函式指標所指的函式。 >// 此時(*> >// 此時會執行函式> 函式名稱其實就是該函式所在的位址,這跟陣列的情況類似: 陣列名稱表示該陣列的起始位址,同時該陣列的所在位址即此起始位址。 > <> <>< face="Verdana, Arial, Helvetica">引言: 這個是什麼意思?為什麼執行起來跟 (fewfunc[1][1])(); // fewfunc[1][1]存的是func11的位址,所以(fewfunc[1][1])()=(func11)()。 (*fewfunc[1][1])(); //*fewfunc[1][1]表示fewfunc[1][1]函式指標裡存的值,因為函式變數的值即其所在的位址,也就是func11的位址。 (*(&fewfunc[1][1]))(); // &fewfunc[1][1]表示函式指標變數fewfunc[1][1]所在的位址; *(&fewfunc[1][1])表示該位址所存的值,也就是fewfunc[1][1],即func11。 效果都一樣?對於指標函數還真是覺得有點奇怪? 跟一般的指標變數的差異性在哪呢?感激...
引言: ShowMessage( IntToHex((__int64)(&fewfunc[1][0]), 4) ); => 403308 //&fewfunc[1][0]表示fewfunc[1][0]存在記憶體中的位址。 ShowMessage( IntToHex((__int64)(fewfunc[1][0]), 4) ); => 401818 ShowMessage( IntToHex((__int64)(*fewfunc[1][0]), 4) ); => 401818 fewfunc[1][0]:存函式func10的位址。 *fewfunc[1][0]:取得fewfunc[1][0]所存位址裡的值,也就是函式func10的值,與func10的位址相同,即func10。
上述說明或有不儘精確之處,希望大家指正,讓它更準確,謝謝!
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-28 15:13:07 IP:61.57.xxx.xxx 未訂閱
謝謝richtop詳盡的回覆,讓我對指標函數有更清楚的了解!謝謝!   
Sarick
一般會員


發表:14
回覆:19
積分:6
註冊:2004-01-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-30 08:25:35 IP:220.135.xxx.xxx 未訂閱
 非常感謝前輩指教!!     非常感謝!!
系統時間:2024-06-26 9:32:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!