![]() |
#2
秀痘魔导士2010-03-25 09:12
你这里是一个函数指针作为参数
先来看看函数指针的概念 函数指针的含义 函数指针即指向函数地址的指针。利用该指针可以知道函数在内存中的位置。因此也可以利用函数指针调用函数。 函数指针的定义方法: <类型> (* <函数名>)(......) 例如: int (*func)( ) 这里,func就是一个函数指针。 注意:int *func( )和int (*func)( )的区别 int *func( ); //这是返回一个整型指针的函数 int (*func)( ); //这是一个函数指针 2、函数指针的使用方法 函数指针即该指针指向的是一个函数的地址。也就是说,它的值只能是代码区中的一个地址。因此不能将其它存储区域的变量地址赋给函数指针。 例4.5.22假定有下面的函数声明 int ptr; int fn(int); int (*fp)(int); 指出下面的语句是否合法?,为什么?。 fp=fn; //正确,将函数fn的地址赋给fp fp=fn(5); //错误,返回给fp的结果不是一个函数地址。 fp=&ptr; // 错误,ptr的地址不在程序代码区,两种数据类型不能转换。 从上面的例子可以看出: (1) 不能将普通变量的地址赋给函数指针; (2) 不能将函数的调用赋给函数指针 (3) 可以将函数名赋给一个函数指针 3、 函数指针用作函数参数 例4.5.23 看下面程序的运行结果 #include <iostream.h> #include <math.h> double sigma(double (*func)(double),double dl,double du) { double dt=0.0; for (double d=dl;d<du;d+=0.1) dt+=func(d); return dt; } void main( ) { double dsum; dsum=sigma(sin,0.1,1.0); cout<<"the sum of sin from 0.1 to 1.0 is "<<dsum<<endl; dsum=sigma(cos,0.5,3.0); cout<<"the sum of cos from 0.5 to 3.0 is "<<dsum<<endl; } 结果是: the sum of sin from 0.1 to 1.0 is 5.01388 the sum of cos from 0.5 to 3.0 is -2.44645 从上面的程序可以看出,利用函数指针可以对函数间接调用。 |
这是历遍链表的程序
想问下下面的语句调visit是什么用法,这里visit是指针还是函数对象下,那些书有介绍此用法的说明呀。
ListTraverse(L,visit);
void visit(ElemType c) /* 与main2-1.c不同 */
{
printf("%d ",c);
}
Status ListTraverse(LinkList L,void(*vi)(ElemType))
/* vi的形参类型为ElemType,与bo2-1.c中相应函数的形参类型ElemType&不同 */
{ /* 初始条件:线性表L已存在 */
/* 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败 */
LinkList p=L->next;
while(p)
{
vi(p->data);
p=p->next;
}
printf("\n");
return OK;