C语言之函数指针

函数指针的定义

一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,与数组名类似。

我们可以将这个函数的首地址赋值给一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。

函数指针的定义形式
// returnType:函数返回值类型
// pointerName:指针名称
// param list:函数的参数列表。参数可以同时指定类型和名称,也可以只指定类型,省略名称。跟函数声明类似
returnType(*pointerName)(param list);

函数指针的基本使用

// 定义基本函数
void message() {}
// 定义函数指针并初始化
void(*func_p)() = &message;
// 调用函数指针,与message()调用等价
func_p(); 
函数指针的应用实例

实例1:将函数指针作为形参来接受外部函数

#include <stdio.h>

int add(int num1, int num2) {
    return num1 + num2;
}

int minus(int num1, int num2) {
    return num1 - num2;
}

// 将函数指针直接定义到函数形参中,类似java中的多态
// 可以将函数指针作为函数参数传入
void showMsg(int(*c)(int, int), int a, int b) {
    int r = c(a, b);
    printf("calculate result: %d\n", r);
}

int main() {
    showMsg(add, 10, 10); // 20
    showMsg(minus, 30, 2); // 28

    return 0;
}

实例2:利用函数指针实现回调函数

#include <stdio.h>

//模拟网络请求回调
void requestNet(char *url, void(*callBack)(char *)) {
    printf("request url: %s, request...\n", url);
    //模拟网络请求耗时
    char *str = "response data: hello world!";
    callBack(str);
}

//回调函数
void netCallBack(char *str) {
    printf("net request callBack\n");
    printf("callBack data: %s\n", str);
}

int main(void) {
    char *url = "www.baidu.com";
    requestNet(url, netCallBack);

    return 0;
}

// 打印结果:
// request url: www.baidu.com, request...
// net request callBack
// callBack data: response data: hello world!
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。