您的位置:首页 > 其它

函数指针的定义与使用

2016-01-27 17:21 225 查看

简单的函数指针

如果从指针的层面上理解函数,那么函数的函数名实际上就是一个指针,指向该函数的代码在内存中的首地址。

声明函数指针:返回类型(*函数名)(参数表)


下面举一个函数指针的小例子:

int (*funcptr)(int);

int f(int a)
{
return a;
}

funcptr=f;
(*funcptr)(2);   //也可以写成funcptr(2)


关于调用函数指针时加不加*的讨论,附上一个比较不错的观点:调用函数指针时加不加星号?

在实际应用中,通常用typedef定义函数指针:

typedef 返回类型(*新类型)(参数表)


与typedef其它应用场合一样,可以用定义的“新类型”来定义函数指针。

typedef int (*FUNCPTR)(int);
FUNCPTR funcptr;

int f(int a)
{
return a;
}

funcptr=f;
(*funcptr)(2);


相信有读者看到这里会发出一个疑问:用typedef定义函数指针类型的时候,为什么不是正常的“类型在左,别名在右”的顺序呢?当然,这也是我学习函数指针时一个疑惑的地方,于是在网上找到了一篇解释的还算合理的博客梁欢,下面是从中选取的一些内容:

typedef是C/C++中用于为现有类型创建更有意义的别名的关键字。对于普通类型来说,类型在左,别名在右:

typedef int size;


如果函数指针的定义也符合这种样式,那么下面下这样定义才是合理的:

typedef void(*)(int) Type;


但实际上编译器采用的是如下的定义方式(以上的代码编译不过去的):

typedef void(*Ptr)(int);


同样的还有对数组的重命名(本来应该是“
typedef char[81] Line;
”形式的,但由于同样的原因不能这样做):

typedef char Line[81];


至于是不是编译器在技术实现上前一种比较困难,我就不得而知了。

C++类中函数指针的使用

定义形式:typedef 返回类型(类名::*新类型)(参数表)


class CA
{
public:
void lcFunc(int a){ cout << "hello" << endl;}
};

CA ca;
typedef void (CA::*PTRFUN)(int);   //定义类成员函数指针类型
PTRFUN pFun;

void main()
{
pFun = &(CA::lcFunc);    //获得类成员函数首地址
(ca.*pFun)(2);    //注意括号的位置ca.*pFunc
}


注: 不要混淆指针函数和函数指针。

指针函数指的是:一个函数返回时不仅可以带回一个整型数据的值,字符类型和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。(小甲鱼C++视频)简单来讲,就是函数返回一个指向某一类型数据的指针,该指针指向的数据为堆内存数据,在函数内部动态申请。

即指针函数为一种函数,函数指针为一种指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: