实验五、函数指针及应用
知识拓展:
函数指针的应用,当调用一个函数时,可能不仅想传入该函数需要被处理的数据,还希望传入指向子程序的指针,该子程序决定如何处理数据。
也可以在数组中存储函数指针,然后使用数组的索引来调用这些函数。例如,键盘驱动程序可能使用函数指针数组,数组索引对应到了键盘编码。当用户按下一个键时,程序就会跳到对应的函数。与数组指针的声明一样,函数指针的声明也需要括号。
一个函数在编译时被分配一个入口地址,这个入口地址就称为函数的指针。
函数名代表函数的入口地址,这一点和数组一样。我们可以用一个指针变量来存放这个入口地址,然后通过该指针变量调用函数。如:假设有一个求两者较大的函数如下:
int max(int x, int y);
当我们调用这个函数时可以这样:
int c;
c=max(a,b);
这是通常调用方法,其实我们还可以定义一个函数指针,通过指针来调用,如:
int (*p)(a,b);
arrayOperate.c 对数组元素进行不同的函数操作
(1)程序说明:在这段程序中,设计foreach()函数,将函数指针作为参数。设计print()函数来打印数组,设计abs()函数来对数组元素的值取绝对值,设计opposite()函数来对数组元素取相反数,设计doubleArray()函数来对数组元素的每个值乘两倍。
(2)实验代码:
#include<stdio.h>
/*
程序说明:在这段程序中,设计foreach()函数,将函数指针作为参数。设计print()函数来打印数组,
设计abs()函数来对数组元素的值取绝对值,设计opposite()函数来对数组元素取相反数,
设计doubleArray()函数来对数组元素的每个值乘两倍。
*/
// 给返回值为void 参数为一个int的函数指针重命名,命名为pFunc_t
typedef void (*pFunc_t)(int*);
void for_each(int *arr, int size, pFunc_t p);
void print(int *n);
void opposite(int *n);
void abstract(int *n);
void doubleArray(int *n);
int main(void){
pFunc_t pri = print;
pFunc_t opp = opposite;
pFunc_t abs = abstract;
pFunc_t dou = doubleArray;
int array[] = {23,-21,24,64,91,19,27};
int length = sizeof(array)/sizeof(array[0]);
printf("before any operation ,array travese :\n");
for_each(array,length,pri);
printf("\nnow begin to get opposite num \n");
for_each(array,length,opp);
for_each(array,length,pri);
printf("\nnow begin to get abstract num \n");
for_each(array,length,abs);
for_each(array,length,pri);
printf("\n now begin to get double num \n");
for_each(array,length,dou);
for_each(array,length,pri);
return 0;
}
calculus.c 对不同函数模拟求积分的过程
(1)程序说明:此程序模拟积分的过程,用来模拟计算不同函数的积分。在Calculate函数中,传入的是变量为func的函数指针
(2)实验代码:
#include<stdio.h>
#include<math.h>
/*
程序说明:此程序模拟积分的过程,用来模拟计算不同函数的积分
*/
double Calculate(double(*func)(double x), double a, double b);
double func_1(double);
double func_2(double);
double func_3(double);
void main()
{
printf("%lf\n", Calculate(func_1, 0, 1));
printf("%lf\n", Calculate(func_2, 0, 1));
printf("%lf\n", Calculate(func_3, 0, 1));
}
/* Calculate用于计算积分。一共三个参数。
第一个为函数指针func,指向待积分函数。
二三参数为积分上下限.
*/
double Calculate(double(*func)(double x), double a, double b)
{
double dx = 0.0001;//细分的区间长度
double sum = 0;
/*
请在此完成对函数func的积分过程,细分的区间长度为dx
*/
return sum;
}
double func_1(double x)
{
return x*x;
}
double func_2(double x)
{
return x*x*x;
}
double func_3(double x)
{
return exp(x);
}