目录
1. 指针
指针是C语言的精髓,熟练的操作指针可以让我们更容易实现所需要的功能。函数指针是指针中比较特殊的。因此这里做如下总结,如有纰漏还望各位大侠指正。
2. 函数指针的定义
2.1 原始定义
int (*func)(int, int);
上面的代码是一个简单的函数指针的定义。其含义如下:
1> 第一个int: 函数返回值类型是整型;
2> 第二、三个int: 加上外面的括号是这类函数的形参表,这里函数的形参表是两个整型数;
3> func : 定义的指针的名字,它可以指向任何一个满足其返回值和形参表要求的函数。
2.2 宏定义
C语言中的宏定义通常采用#define, 目的是让变量等表达的含义更清楚和简捷。
#define MY_DBG_PRINT(a, b) (*func)(a, b)
以上是对函数指针func实现的宏定义。
2.3 类型重定义
C语言中经常使用类型重定义typedef来简化代码的书写。
typedef int(*DBG)(int, int);
这样我们就能使用DBG来定义指向这类函数的指针了。
3.函数指针应用举例
3.1 定义与实现
下面我们定义一个简单的格式化输出函数:
//打印输出函数
int my_print(int a, int b)
{
printf("from my_print: a, %d b, %d", a, b);
}
int (*func)(int, int);//原始定义
typedef int(*DBG)(int, int);//类型重定义
#define MY_DBG_PRINT(a, b) (*func)(a, b)//宏定义
int main()
{
func = my_print;//函数名本身就是指向该函数的指针
(*func)(1,2);//这里就是用我们定义的函数指针调用该函数,这里实际上执行的时my_print函数
MY_DBG_PRINT(1,2);//这里和上一句实现的功能相同
DBG my_func = my_print;//函数指针定义和初始化
(*my_func)(1,2);//这一句和上面两次函数调用相同
return 0;
}
3.2 函数指针_返回值、形参、类型强转
1> 函数指针做返回值:
int(*my_func(char a))(int, int);
这里定义了一个函数,函数名为my_func,函数的形参是一个字符型变量a,函数的返回值是一个函数指针,这个指针的类型和前面定义的DBG类型一致。这里其实就可以体现类型重定义的好处。如果采用DBG这个类型重定义,那么和上面等价的定义方式如下:
DBG my_func(char a);
2> 函数指针做形参
int get_func(int(*)(int, int));
上面的代码定义了一个函数,函数名为get_func,返回值是整型,形参是一个函数指针,这个指针的类型与上面定义的DBG类型一致。同样如果采用重定义后,这个函数定义可以简化为:
int get_func(DBG);
3> 强制类型转换
有些函数为了统一接口返回的指针通常是void*型,由用户来判断实际指针类型,比如void *dlsym(oid* handle, const char * symbol)函数就可以通过句柄和连接符获取动态链接库中的函数名或变量名可以看出该函数的返回值就是void *指针类型,这时候就要进行类型强制转换,假设我们要从动态链接库中获取my_print这个函数,就应该编写如下代码:
int(*func)(int, int) = (int(*)(int, int))dlsym(handle, "my_print");
采用类型重定义后代码可简捷的写为:
DBG func = (DBG)dlsym(handle, "my_print");
现在能想到的就这么多,如果有什么错误,还请读者批评指正。