函式指標(function pointer)

  • Function Pointer 顧名思義,就是指向 Function 的指標。在 C 語言中,不論是 variable、array、struct、或是 function(一段程式碼),都有所屬的起始記憶體位置。

    • 變數的指標指向變數的位址,同樣的,function pointer (函式指標) 也是指向函式的位址的指標。
    • 而每個function 的啟始記憶體位置,即為 function 的名稱。
  • 而 function pointer 的宣告跟使用 function 時所要注意的地方是相同的,有以下幾點必須注意:

    • 回傳值型態(return type)
    • 參數數量(augument count)
    • 參數型態(argument type)
  • Function Pointer:指向函數的指標。 int (*pfunc)(int);

  • Function return a pointer: 回傳指標的函數。 int* func(int);
  • Function pointer return a pointer。 int (pfunc)(int);
// 函式宣告如下
void func1(int int1, char char1);

/* 指向func1的指標如下:
 * 這樣的寫法應理解成:funcPtr1是一個函數指標,它指向的函數接受int與char兩個參數並回傳void。(signature)
 */
void (*funcPtr1)(int, char);

/* 如果今天有另一個函式有相同的參考簽名
 * 則funcPtr1也能指向func2。
 */
void func2(int int2, char char2);

// 函式指標指向函式1
funcPtr1 = &func1;

// 函式指標指向函式2
funcPtr1 = &func2;

// 在宣告時就直接給予初值,則如下:
void (*funcPtr1)(int, char) = &func1;    //&亦可省略

function pointer做為函式的參數

int do_math(float arg1, int arg2) {
    return arg2;
}

// 不使用typedef的原始宣告方法
int call_a_func(int (*call_this)(float, int)) {
    int output = call_this(5.5, 7);
    return output;
}

// 使用typedef的宣告方法
typedef int (*MathFunc)(float, int);
int call_a_func2(MathFunc call_this) {
    int output = call_this(5.5, 7);
    return output;
}

int final_result = call_a_func(do_math);

function pointer array用法

  • 根據state變數的狀態去呼叫對應的函式。
    • state: 0,執行run()
    • state: 1,執行stop()
    • state: 2,執行exit()
void run() { printf("start\r\n"); }
void stop() { printf("stop\r\n"); }
void exit() { printf("exit\r\n"); }

static void (*command[])(void) = {run, stop, exit};

int OnStateChange(uint state) {

    if (state > 3) {
        printf("Wrong state!\n");
        return false;
    }

    command[state]();
    return 0;
}

results matching ""

    No results matching ""