[C 语言笔记--Day13] Pointers to Functions

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


<<:  那些被忽略但很好用的 Web API / Selection

>>:  【Side Project】 菜单内容(建立资料库)

Day03:认识MVT

背景知识 首先必须先知道网站的运作分为client(客户端)和server(服器端)两者比次运作 从...

[Day 10]怎麽每天都像在赶末班电车R(後端篇)

挑战目标: MockNative Camp前端 今天到101取I13 pro替换我的I10,不知道是...

(PYTHON)请问 CKIPtagger 如何断"句"

请问PYTHON的CKIPtagger套件 如何断句? 上网找了都没有看到 ...

全端入门Day08_何谓全端之後端末篇

昨天介绍了框架,今天要来介绍冰箱,ㄟ不是啦是要介绍资料库 所以今天的重点就是资料库 何谓资料库呢?顾...

Day 2:Golang 是什麽?

Golang 基本介绍: 是 Google 开发的静态编译程序语言,支援垃圾回收与并发,跟 C 的撰...