前天在網路上看到某面試考題,看到不能使用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;
}
文章標籤
全站熱搜
