iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
自我挑戰組

C 語言筆記系列 第 13

[C 語言筆記--Day13] Pointers to Functions

  • 分享至 

  • xImage
  •  

pointers to functions 乍聽之下好像有點奇怪,

但一個 function 跟資料同樣都是要放在 main memory 裡的,

這麼想的話,可以有個 pointer 指到一個 function 的 memory address,也就不是很奇怪的事情了

如何宣告一個 pointer to function

double foo(int, int);

以上面的例子來說:
foo 是一個 pointer to function,需要兩個 int 的參數
並且會回傳一個 double 的回傳值

把 pointer to function 當成參數

下面是一個把 pointer to function 當成 function 參數的例子:

#include <stdio.h>

int add(int a, int b)
{
    return a + b;
}

int mul(int a, int b)
{
    return a * b;
}

/* 參數 op 是一個 pointer to function
 * op 需要兩個 int 的參數
 * 並且會回傳一個 int 的 return value
 * do_op 的 body 裡可以使用這個參數 op */
int do_op(int a, int b, int c, int op(int, int))
{
    int result;
    result = op(a, b);
    result = op(result, c);
    return result;
}

int main()
{
    int a, b, c, result1, result2;
    a = 2;
    b = 3;
    c = 4;

    /* func_ptr 是一個
     * 1. pointer to
     * 2. function with two int arguments 
     * 3. returning int */
    int (*func_ptr)(int, int);
    func_ptr = &mul; // 跟 &mul 的型別相同,所以可以 assign 過去

    /* add 這個 function 被當成參數傳進去了 */ 
    result1 = do_op(a, b, c, add); 

    /* *func_ptr (也就等同 mul) 被當成參數傳進去了 */ 
    result2 = do_op(a, b, c, *func_ptr);

    // result1 = 2 + 3 + 4 = 9
    printf("result1 = %d\n", result1);
    // result1 = 2 * 3 * 4 = 24
    printf("result2 = %d\n", result2);
}

參考資料

C Programming: A Modern Approach, 2/e


上一篇
[C 語言筆記--Day12] system call 的執行步驟
下一篇
[C 語言筆記--Day14] pointer, function, array 同時出現在一行宣告時該如何解讀
系列文
C 語言筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言