我有一個函式指標陣列
int callRED(int); //func 1
int callGREEN(int); //func2
int callBLUE(int); //func3
int (*pwmCallPointer[3])(int) = {callRED, callGREEN, callBLUE }; //array of function pointer
我會呼叫 ledOnOff 函式,例如傳遞 pwmCallPointer[0] 來呼叫 callRED 函式
原型應該如何?這個不起作用:
void ledOnOff(int, int, int, int, pwmCallPointer*);
呼叫將是例如:
ledOnOff(0, 0, 0, 0, pwmCallPointer[0])
uj5u.com熱心網友回復:
原型應該如何?
ledOnOff()
函式的第五個引數應該是指向一個函式的指標,該函式接受一個型別的引數int
并回傳一個int
. 所以,原型應該是:
void ledOnOff(int, int, int, int, int (*fptr) (int));
^^^^^^^^^^^^^^^^^
為了更好的可讀性:
typedef int (*fptr) (int); // fptr is an alias of type int (*) (int)
// Declare array of function pointers of type fptr
fptr pwmCallPointer[] = {callRED, callGREEN, callBLUE};
// ledOnOff prototype
void ledOnOff(int, int, int, int, fptr);
// call it like this
ledOnOff(0, 0, 0, 0, pwmCallPointer[0]);
uj5u.com熱心網友回復:
在定義指標陣列時,您已經發現了正確的語法:
void ledOnOff(int(*pwmCallPtr )(int));
// just omitting the array ^^
// declaration
typedef 可以使整個事情變得更容易:
typedef int(Callback)(int);
void ledOnOff(Callback* cb);
請注意,有一個替代變體:
typedef int(*Callback)(int);
// ^
允許宣告void ledOnOff(Callback cb);
——不過,我個人更喜歡前一種變體,因為它不會隱藏變數或引數的指標性質。
旁注:您的原始變體
void ledOnOff(pwmCallPointer*);
編譯失敗,因為pwmCallPointer
沒有命名型別,而是命名全域變數。函式指標的型別是int(*)(int)
, 和int(*ptr)(int)
宣告一個變數或引數一樣char* ptr
,只是語法更復雜。你甚至可以給它命名pwmCallPointer
——就像全域陣列一樣。但是請注意,您有兩個不同的變數(全域變數和區域引數),它們只是共享相同的名稱,并且在函式內全域變數被區域變數隱藏。當然,不建議這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/385164.html
上一篇:C 11關于*begin(a)
下一篇:在函式中修改字串的最佳方法?