關於函式指標ㄉ問題 |
尚未結案
|
Sarick
一般會員 發表:14 回覆:19 積分:6 註冊:2004-01-19 發送簡訊給我 |
小弟有一個關於函式指標ㄉ問題想請教各位前輩.... 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 發送簡訊給我 |
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 發送簡訊給我 |
|
hornacek
一般會員 發表:29 回覆:76 積分:21 註冊:2004-02-02 發送簡訊給我 |
引言: 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 發送簡訊給我 |
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 發送簡訊給我 |
|
Sarick
一般會員 發表:14 回覆:19 積分:6 註冊:2004-01-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |