函数指针
函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。函数指针有两个用途:调用函数和做函数的参数。
方法
函数指针的声明方法为:#include<stdio.h>
int max(int x,int y){ return(x>y?x:y);
void main()
{
int (*ptr)(int, int);
int a,b,c;
ptr=max;
scanf("%d,%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
#include<stdio.h>
void FileFunc()
{
printf("FileFunc\n");
}
void EditFunc()
{
printf("EditFunc\n");
}
void main()
{
typedef void (*funcp)();
funcp pfun= FileFunc;
pfun();
pfun = EditFunc;
pfun();
}
指针函数和函数指针的区别
1,这两个概念都是简称,指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。#include<iostream>
using namespace std;
void main()
{
float *find(float(*pionter)[4],int n);
static float score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}};
float *p;
int i,m;
cout<<"Enter the number to be found:";
cin>>m;
p=find(score,m);
for(i=0;i<4;i++)
{
cout<<" "<<*(p+i);
}
float *find(float(*pionter)[4],int n)/*定义指针函数*/
float *pt;
pt=*(pionter+n);
return(pt);
}
函数指针数组的定义
关于函数指针数组的定义方法,有两种:一种是标准的方法;一种是蒙骗法。#include "stdio.h"
int add1(int a1,int b1);
int add2(int a2,int b2);
void main()
{
int numa1=1,numb1=2;
int numa2=2,numb2=3;
int (*op[2])(int a,int b);
op[0]=add1;
op[1]=add2;
printf("%d %d\n",op[0](numa1,numb1),op[1](numa2,numb2));
}
int add1(int a1,int b1)
{
return a1+b1;
}
int add2(int a2,int b2)
{
return a2+b2;
}
定义成员函数函数指针类型
typedef void (Class1::* Mem1) (void);
成员函数指针, 静态函数指针,全局函数指针 区别
C++的函数指针包括三种: 全局函数指针,类的static函数指针和成员函数指针。前两个几乎没有区别,最后一个与前面两个有本质的区别。是完全不同的类型。C++是强类型的语言,所以使用两类指针时,不能直接赋值。先来看一下他们定义和调用的语法吧:
class C
{
public:
int mem_fun(int arg);
static int static_fun(int arg);
};
int global_fun(int arg);
typedef int (C::*Mem_fun)(int arg);
Mem_fun pmf = &C::mem_fun; // &(C::mem_fun) is error
C ci;
(ci.*pmf)(1); // ci.(*pmf)(1) error; (ci.(*pmf))(1) error;
typedef int (*C_Fun)(int arg);
C_Fun p_static_fun = &C::static_fun;
C_Fun p_global_fun = &global_fun;
C++的member function pointer调用时,需要依赖具体的对象(或指针);而全局函数和类的static函数指针是可以直接调用的,两种指针的基类型完全不同,调用需要的参数也不同,不能转化。
贴一下STL的 mem_fun_t 和 mem_fun_ref_t 的实现:
template <class _Ret, class _Tp>
class mem_fun_t : public unary_function<_Tp*,_Ret>
{
public:
explicit mem_fun_t(_Ret (_Tp::*__pf)())
:_M_f(__pf)
{
}
_Ret operator()(_Tp* __p) const
{
return (__p->*_M_f)();
}
private:
_Ret (_Tp::*_M_f)();
};
template <class _Ret, class _Tp>
class mem_fun_ref_t : public unary_function<_Tp,_Ret>
{
public:
explicit mem_fun_ref_t(_Ret (_Tp::*__pf)())
: _M_f(__pf)
{
}
_Ret operator()(_Tp& __r) const
{
return (__r.*_M_f)();
}
private:
_Ret (_Tp::*_M_f)();
};
这两个class 是成员函数指针的adapter, 方便泛型算法的调用。从 operator ()的实现中可以明确看出 member function pointer 的使用方法。