函数指针的定义
一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,与数组名类似。
我们可以将这个函数的首地址赋值给一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。
函数指针的定义形式
// 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!
网友评论