函数指针
1. 什么是函数指针?
函数指针指向的是特殊的数据类型,函数的类型是由其返回的数据类型和其参数列表共同决定的,而函数的名称则不是其类型的一部分。本质是一个指针变量。
2.初始化和赋值
我们知道,不带下标操作符的数组名会被解释成指向首元素的指针。当一个函数名没有被调用操作符修饰时,会被解释成指向该类型函数的指针。假如我们现在实现了一个函数lexicoCompare:
int lexicoCompare( const string &s1, const string &s2 ){}
则表达式:lexicoCompare;被编译器解释成类型:int (*)( const string &, const string & ); 的指针,
此时lexicoCompare和&lexioCompare类型是一模一样的。
指向函数的指针可如下被初始化:
int (*pfi)( const string &, const string & ) = lexicoCompare;
int (*pfi2)( const string &, const string & ) = &lexicoCompare;
指向函数的指针可以如下被赋值:
pfi = lexicoCompare;
pfi2 = pfi;
注意:只有当赋值操作符左边指针的参数表和返回类型与右边函数或指针的参数表和返回类型完全匹配时, 初始化和赋值才是正确的。如果不匹配,则将产生编译错误消息。在指向函数类型的指针之间不存在隐式类型转换。
3. 应用举例
#include <iostream>
#include <string>
using namespace std;
// 定义函数指针pf
int (*pf)(const int&, const int&);
// 定义函数指针类型cmpFun
typedef int (*cmpFun)(const int&, const int&);
// 具体函数
int intCompare(const int& aInt, const int& bInt)
{
if(aInt == bInt) return 0;
if(aInt > bInt)
{
return 1;
}
else
{
return -1;
}
}
int main(void)
{
int aInt = 1;
int bInt = 2;
pf = intCompare;
// pf = &intCompare; // 和上面一句是完全一样的
// 使用pf
if(pf(aInt, bInt) == 0)
{
cout << "two integers are equal" << "." << endl;
}
else if(pf(aInt, bInt) > 0)
{
cout << aInt << " is greater than " << bInt << "." << endl;
}
else
{
cout << aInt << " is less than " << bInt << "." << endl;
}
cout << "------------------------" << endl;
// 用函数指针类型cmpFun声明并初始化一个函数指针pf2
cmpFun pf2 = intCompare;
// 使用pf2
if(pf2(aInt, bInt) == 0)
{
cout << "two integers are equal" << "." << endl;
}
else if(pf(aInt, bInt) > 0)
{
cout << aInt << " is greater than " << bInt << "." << endl;
}
else
{
cout << aInt << " is less than " << bInt << "." << endl;
}
return 0;
}
4. 函数指针用作参数:
#include<stdio.h>
void MyFun1(int x);
void MyFun2(int x);
void MyFun3(int x);
typedef void (*FunType)(int ); /* ②. 定义一个函数指针类型FunType,与①函数类型一致 */
void CallMyFun(FunType fp,int x);
int main(int argc, char* argv[])
{
CallMyFun(MyFun1,10); /* ⑤. 通过 CallMyFun 函数分别调用三个不同的函数 */
CallMyFun(MyFun2,20);
CallMyFun(MyFun3,30);
return 0;
}
void CallMyFun(FunType fp,int x) /* ③. 参数fp的类型是 FunType。*/
{
fp(x);/* ④ . 通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的。 */
}
void MyFun1(int x) /* ①. 这是个有一个参数的函数,以下两个函数也相同。 */
{
printf("函数MyFun1 中输出:%d\n",x);
}
void MyFun2(int x)
{
printf("函数MyFun2 中输出:%d\n",x);
}
void MyFun3(int x)
{
printf("函数MyFun3 中输出:%d\n",x);
}
指针函数
1. 指针函数是一般是指返回指针的函数,即本质是一个函数。函数返回类型是某一类型的指针
2.使用:
#include <stdio.h>
int* fun( int* a)
{
return a;
}
int main(int argc, char **argv)
{
int a = 3;
printf("%d\n", *fun(&a));//结果 3
return 0;
}
两者最明显的区别就是*在不在圆括号里面
int *pf( ... ); //指针函数
int (*pf)( ...); //函数指针
c++提供的函数运算符从某种意义上来讲就是取代c语言中中的函数指针。 参考我之前的一片文章:
http://blog.csdn.net/meetings/article/details/46604769