前天在網路上看到某面試考題,看到不能使用If和Switch條件式去進行函式呼叫,頓時不知所措,因此花了一點時間解決此問題,原來是要使用Function pointer array實現,透過陣列索引的方式呼叫不同函式。
題目:實現下面程式碼,且保證n一定是上面五個數字之一,不能用if和switch case,請用你認為最快的方法實作main。
extern void func1(void);
extern void func2(void);
extern void func3(void);
extern void func4(void);
extern void func5(void);
void main(int n)
{
if n == 1 execute func1;
if n == 2 execute func2;
if n == 3 execute func3;
if n == 4 execute func4;
if n == 5 execute func5;
}
解析:
宣告一個function pointer變數,以便於指向函式。
此範例函數型態為: void func1(void)
因此宣告function pointer為: void(*fptr)(void);
(最前面的型態是變數data type(資料型態),和指向的函式回傳值型態相同,第一個小括號代表指標變數名稱,第二個小括號代表傳入的parameter資料型態)
要將所有函式放進此陣列中,所以要宣告為陣列形式: void(*fptr[5])(void);
實際實現程式碼如下所示。
實作程式碼
#include "stdafx.h" #include "stdlib.h" void func1(void) { printf("1\n"); }; void func2(void) { printf("2\n"); }; void func3(void) { printf("3\n"); }; void func4(void) { printf("4\n"); }; void func5(void) { printf("5\n"); }; int main() { int n; while (1) { printf("input:"); scanf_s("%d", &n); void(*fptr[5])(void); fptr[0] = func1; fptr[1] = func2; fptr[2] = func3; fptr[3] = func4; fptr[4] = func5; if (n > 5) break; fptr[(n-1)](); } printf("finish"); system("pause"); return 0; }