函数指针的定义与使用

简单的函数指针

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

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

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

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++视频)简单来讲,就是函数返回一个指向某一类型数据的指针,该指针指向的数据为堆内存数据,在函数内部动态申请。
即指针函数为一种函数,函数指针为一种指针。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值