【C学习笔记】强大的 void * 指针,指向任意函数并调用该函数!
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//构造三个参数和返回值不同的函数;
int fun1(int a, int b)
{
return a + b;
}
char* fun2(char* a, char* b) //合并a,b字符串
{
int len = strlen(a) + strlen(b);
char *res = (char *)malloc(sizeof(char)*len);
strcpy(res, a);
strcat(res, b);
return res;
}
float fun3(int arr[], int size) //求平均值
{
float sum = 0;
for (int i = 0; i<size; i++)
{
sum += arr[i];
}
return sum / size;
}
int main()
{
//普通测试fun1
int a1 = 10, a2 = 20;
printf("fun1的结果是:%d\n", fun1(a1, a2));
//普通测试fun2
char* c1 = "I love ";
char* c2 = "C Language.\n";
char *res = fun2(c1, c2);
printf("fun2的结果是:%s", res);
//普通测试fun3
int num[9] = {100,12,16,18,22,65,14,20,44};
printf("fun3的结果是:%f\n", fun3(num, sizeof(num)/sizeof(int)));
printf("\n");
/* 接下来用void指针来分别指向上面三个函数并调用 */
void* p;
p = fun1; //fun1 的函数指针是:int(*p)(int,int); 去掉p,即函数类型是 int(*)(int,int)
printf("空指针调用fun1的结果是:%d\n", ((int(*)(int, int))p)(a1, a2));
p = fun2; //fun21 的函数指针是:char*(*p)(char*,char*) ;去掉p,即函数的类型是 char*(*)(char*,char*)
printf("空指针调用fun2的结果是:%s\n", ((char*(*)(char*,char*))p)(c1,c2));
p = fun3; //fun3 的函数指针是float(*p)(int[],int);去掉p,即函数的类型是 float(*)(int[],int)
printf("空指针调用fun2的结果是:%f\n",((float(*)(int[],int))p)(num,sizeof(num)/sizeof(int)));
system("pause");
return 0;
}
举个通用例子:
函数原形:int fun1(int a, int b);
函数指针:int (*p)(int, int); //把fun1用 (*p)代替;即得函数指针
函数类型:int (*)(int, int) //把函数指针的p去掉,即为该函数的类型,为强制转换所用。
强制转换: (int (*)(int, int ))p ; 把 void *p 指针强制转换成 函数类型
调用函数:((int (*)(int, int))p)(a,b) ; //调用参数(a,b)
以上代码在VS2017中测试通过:
原创博主:黄仁来,转载请注明出处; 2018-10-04