高级会员

- 积分
- 501
- 金钱
- 501
- 注册时间
- 2013-1-12
- 在线时间
- 28 小时
|
当声明一个函数指针时,必须声明他所指向的函数类型。要指定函数类型,就要指出函数的返回值类型和函数的形参类型。例如 考虑下面的原型: void ToUpper(char*) 函数的类型是具有char*类型的参量,其返回值类型是void。要声明这种函数类型的指针可以这样做: void (*pf)(char*) //pf是一个指向函数的指针 从这个声明中可以看出,第一对圆括号将运算符*和pf结合在了一起,这就意味着pf是一个指向函数的指针。这就使得(*pf)是一个函数,并使(char*)作为该函数的形参列表,void作为其返回值的类型。
有了函数指针之后,可以吧适当类型的函数地址赋给它。在这种场合中,函数名可以用来表示函数的地址:
void ToUpper (char*);
void ToLower(char*);
int round (double);
void (*pf) (char*);
pf=ToUpper;//合法,ToUpper是函数ToUpper()的地址
pf=ToLower;//合法,ToLower是函数ToLower()的地址
pf=round;//无效,round是错误类型的函数
pf=ToLower();//无效,ToLower()不是地址
最后一种赋值方式是不正确的,因为不能在一个赋值语句中使用一个void类型的函数。注意,指针pf可以指向任何接受一个char*参数并返回类型为void的函数,而不能指向具有其他地址特性的函数。
正像可以使用一个数据指针访问数据一样,也可以使用函数指针来访问函数:
void ToUpper (char*);
void ToLower(char*);
void (*pf)(char*);
char mis[]=“Nina Merier”;
pf=ToUpper;
(*pf)(mis);//把ToUpper作用于mis(语法1)
pf=ToLower;
pf(mis);//把ToLower作用于mis(语法2)
每种方法看起来都是有道理的,第一种方法:pf指向ToUpper函数,*皮肤就是ToUpper函数,因为此表达式(*pf)(mis)与ToUpper(mis)一样。第二种方法:因为函数名是一个指针,可以互换使用指针和函数名,因此pf(mis)与ToLower(mis)一样。
正如数据指针最常见的用法之一是作为函数的参数一样,函数指针最普遍的用法之一也是作为函数的参数。例如,考虑下面的原型:
void show (void(*fp)(char*),char*str);
这看起来很混乱,但是它声明了两个参量fp和str。参量fp是一个函数的指针,str是一个数据指针。更具体一点,fp指向接受一个char*参量且返回类型为void的函数,str指向一个char值。因此,给定前面的声明,可以使用像下面这样的函数调用:
show (ToLower,mis);//show()使用ToLower()函数:fp=ToLower
show (pf,mis);//show()使用由pf指向的函数:fp=pf
show()如何使用传递过来的函数指针呢?他使用语法fp()或是(*fp)()来调用函数:
void show (void(*fp)(char*),char*str)
{
(*fp)(str);//把所选函数作用于str
puts(str);//显示结果
}
这里show()首先把fp指向的函数作用于字符串str来转换str,然后在显示转换后的字符串。
与大家分享了函数与指针的关系,因为函数指针非常的强大,很难一语道破其中深奥的精髓,只有努力不断地学习,再难的东西也会慢慢的攻破!呵呵
|
|