1.函数指针
函数指针就是函数的指针;它是一个指针,指向一个函数。
看代码如下:
A) char * (*fun1)(char * p1,char * p2);
B) char * *fun2(char * p1,char * p2);
C) char * fun3(char * p1,char * p2);
解释如下:
C) fun3是函数名,p1,p2是参数,其类型为char *型,函数的返回值为char *类型。
B) 与C)表达式相比,唯一不同的就是函数的返回值类型为char**,是个二级指针。
B) 与C)表达式相比,唯一不同的就是函数的返回值类型为char**,是个二级指针。
A) fun1是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指针。
接下来就给大家一个应用函数指针有关积分计算的例子:
#include <stdio.h>
//Calculate用于计算积分。一共三个参数。第一个为函数指针func,指向待积分函数。二三参数为积分上下限
double Calculate(double(*func)(double x), double a, double b)
{
double dx = 0.0001;//细分的区间长度
double sum = 0;
for (double xi = a+dx; xi <= b; xi+=dx)
{
double area = func(xi)*dx;
sum +=area;
}
return sum;
}
double func_1(double x)
{
return x*x;
}
double func_2(double x)
{
return x*x*x;
}
void main()
{
printf("%lf\n", Calculate(func_1, 0, 1));
printf("%lf\n", Calculate(func_2, 0, 1));
}
2.函数指针数组
函数指针数组是一个其元素是函数指针的数组。也就是说,此数据结构是一个数组,且其元素是一个指向函数入口地址的指针。
首先说明是一个数组:数组名[]
其次,要说明其元素的数据类型指针:*数组名[].
再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型(*数组名[])().请注意,因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括号的结合方向,那么 *数组名[]() 说明的是元素返回值类型为指针的函数数组。
首先说明是一个数组:数组名[]
其次,要说明其元素的数据类型指针:*数组名[].
再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型(*数组名[])().请注意,因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括号的结合方向,那么 *数组名[]() 说明的是元素返回值类型为指针的函数数组。
例如:
void (*funcPointerArray[3])(double x);//函数指针数组
void (*funcPointer)(double x);//函数指针
如何使用:
void f1(double x){}
void f2(double x){}
void f3(double x){}
来三个具体的函数,f1,f2,f3
void (*funcPointerArray[3])(double x);
funcPointerArray[0]=f1;
funcPointerArray[1]=f2;
funcPointerArray[2]=f3;
funcPointerArray[0](“2.333333”);
funcPointerArray[1](“6.666666”);
具体应用:
#include <stdio.h>
void addItem(char *name)
{
printf("Add %s successfully!\n",name);
}
void deleteItem(char *name)
{
printf("Delete %s successfully!\n", name);
}
void findItem(char *name)
{
printf("Find %s successfully!\n", name);
}
void updateItem(char *name)
{
printf("Update %s successfully!\n", name);
}
void main()
{
void(*funcPointerArray[4])(char *name);
funcPointerArray[0] = addItem;
funcPointerArray[1] = deleteItem;
funcPointerArray[2] = findItem;
funcPointerArray[3] = updateItem;
printf("Please enter a number(0-3) to continue:");
int num;
scanf_s("%d", &num,1);
printf("Please enter the name of the goods:");
char buf[128];
scanf_s("%s", &buf,128);
funcPointerArray[num](buf);
}
3.线性表
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a*b;
}
int div(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移
表
while (input)
{
printf( "*************************\n" );
printf( " 1:add 2:sub \n" );
printf( " 3:mul 4:div \n" );
printf( "*************************\n" );
printf( "请选择:" );
scanf( "%d", &input);
if ((input < 4 && input > 1))
{
printf( "输入操作数:" );
scanf( "%d %d", &x, &y);
ret = (*p[input])(x, y);
}
else
printf( "输入有误\n" );
printf( "ret = %d\n", ret);
}
return 0;
}