前天在網路上看到某面試考題,看到不能使用IfSwitch條件式去進行函式呼叫,頓時不知所措,因此花了一點時間解決此問題,原來是要使用Function pointer array實現,透過陣列索引的方式呼叫不同函式。


題目:實現下面程式碼,且保證n一定是上面五個數字之一,不能用ifswitch 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;
}

 

arrow
arrow
    創作者介紹
    創作者 水面上的小草 的頭像
    水面上的小草

    大家一起學AI

    水面上的小草 發表在 痞客邦 留言(0) 人氣()