C 语言 函数指针

189 阅读1分钟

1. 关于地址

void func(int a, int b) {
    printf("---------------------%d  ------------  %d\n", a, b);
}

int main() {
//    相同的地址
    printf("-------------------%d\n", func);
    printf("-------------------%d\n", &func);
    printf("-------------------%d\n", *func);
    return 0;
}

2. 关于声明

    /*函数指针命名*/
//    声明指针变量
    void (*f)();
//    关联
    f = func;
//    调用
    f(10, 20);

3. 关于回调

/**
 * 参数添加函数指针
 * @param a
 * @param b
 * @param callback 函数指针  回调
 * @return
 */
int text(int a, int b, int (*callback)(int)) {
    int result = a + b;
    callback(result);
}

int call(int result) {
    printf("----------------------%d\n", result);
}

// 调用
text(10, 20, call);

3. 关于别名(宏定义)

typedef int FUNC(int, int);

void func(int a, int b) {
    printf("---------------------%d  ------------  %d\n", a, b);
}

FUNC *p = func;
p(15, 23);
(&func)(15, 25);
(*func)(52, 6021);
(*p)(62, 712);

4. 函数指针数组

/**
 * 函数指针数组
 *
 * 用来做观察者模式    声明观察者集合
 */

typedef int FUNC(int, int) ;

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

int jian(int a, int b) {
    return a - b;
}

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

int chu(int a, int b) {
    return a / b;
}

int main() {
    /*定义函数指针数组*/
//    (int a, int b) 是函数  *p[4] 是指针数组  从后向前读就是:函数指针数组
    int (*p[4]) (int a, int b) = {jia, jian, cheng, chu};
    int a = 10;
    int b = 5;
    for (int i = 0; i < 4; ++i) {
        printf("---------------%d\n", p[i](a, b));
    }
    return 0;
}

5. 值传递和地址传递的区别

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

int jian(int a, int b) {
    return a - b;
}

void change(int (**p1) (int, int)) {
    *p1 = jia;
}

int main() {
    int (*p) (int, int) = jia;
    printf("---------------%d\n", p(10, 30));
    p = jian;
    printf("---------------%d\n", p(10, 30));
//    不会改变   值传递  会报错
//    change(p);
//    printf("---------------%d\n", p(10, 30));
//    会改变   传递地址
    change(&p);
    printf("---------------%d\n", p(10, 30));
    return 0;
}