c_函数指针
函数名本质上就是函数指针(函数名就是一个地址)。
函数指针的定义方式
先定义出函数类型,再通过类型定义函数指针
typedef void (FUNC_TYPE) (int, char );
FUNC_TYPE *pFUNC;
定义出函数指针类型,再通过类型定义函数指针变量
typedef void (*FUNC_TYPE) (int, char );
FUNC_TYPE pFUNC;
直接定义函数指针变量
void (*pf) (int, char)
函数指针最常见的两个用途
(1)转换表(jump table)
(2)函数指针作为参数传递给另一个函数。
声明一个函数指针,并不能马上使用,在使用之前必须将其初始化指向某个函数。
初始化函数指针的方法:
int f(int); int (*pf)(int) = &f;
第二个声明创建了函数指针pf,并把它初始化指向函数f。
&可以省略,因为函数名会被编译器解释为函数指针。
函数指针被声明并且初始化后,我们就有三种方式调用。
int ans; ans = f(25); ans = pf(25); ans = (*pf)(25);
第一种方式通过名字调用函数f,函数名f首先被转换为一个函数指针,该指针指定函数在内存中的位置。然后函数调用操作符调用该函数,执行开始于这个地址的代码。
第二种方式,直接使用函数指针调用。
第三种方式,对pf执行间接访问操作。
回调函数
这里有一个简单的函数,它用于在一个单链表中查找一个值。它的参数是指向链表第一个节点的指针以及需要查找的值。
Node * search_list(Node *node, int const value)
{
while(node != NULL)
{
if(node->value == value){
break;
}
node = node->link;
}
return node;
}
使用这种技巧的函数叫做回调函数(callback function)。因为用户把一个函数指针作为参数传递给其他函数,后者将“回调”用户的函数。
案例:
提供一个函数,实现对任意类型的数组进行排序,排序规则利用选择排序,排序顺序由用户自己决定。
提供一个函数,可以打印任何数据类型。
(1)函数的参数
一个指向任何数据类型的指针(void *),一个函数指针。
(2)通过函数指针调用用户自己提供的函数。
提供一个函数,可以打印任何类型的数组。
#include <stdio.h>
#include <stdlib.h>
/*打印任何数据类型
*
* */
typedef int (*PRINTTYPE)(void *);
int printData(void *pi, PRINTTYPE type){
int i_ret = 0;
i_ret = type(pi);
if(i_ret)
{
printf("函数调用失败");
return -1;
}
return 0;
}
int myself_printInt(void *p1){
int *i = p1;
printf("%d\n", *i);
return 0;
}
int myself_printDouble(void *p2){
double *d = p2;
printf("%.2lf\n", *d);
return 0;
}
int main(void){
int i = 10;
double d = 90002.98;
printData(&i, myself_printInt);
printData(&d, myself_printDouble);
return 0;
}
posted on 2021-08-07 17:37 XiaoXiaoli 阅读(62) 评论(0) 收藏 举报
浙公网安备 33010602011771号