【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中测试通过:

【C学习笔记】强大的 void * 指针,指向任意函数并调用该函数!

原创博主:黄仁来,转载请注明出处; 2018-10-04