深入理解函数指针和函数数组

深入理解函数指针和函数数组

理解函数指针首先理解它的类型,首先函数指针是个指针,他指向一个函数。其次与普通变量指针相同重要的一点是函数指针的类型,如果两个函数的参数个数、参数表、返回值类型都相同,则这两个函数是同一个类型。换句话说同一类型的函数指针可以指向这两个函数

我们先看一个例子:
#include<iostream>
using namespace std;
typedef int f2(int,int);
int fa(int a,int b)
{
    return a+b;
}
int main()
{
    f2 *c1=&fa;//函数指针c1指向的类型是f2,与fa的类型相同。c1的值是fa的地址
    cout<<(*c1)(5,6)<<endl;//*c1==fa  ,输出fa(5,6)的值。输出11
    return 0;
}

上面的 typedef int f2(int,int); 代表f2是一个函数,函数的类型是 接受两个int类型的参数,返回int类型的值

如果对上面的typedef int f2(int,int); 不理解可以进一步看介绍 typedef的博客https://blog.csdn.net/Dch19990825/article/details/81024419

现在定义一个函数fa,他的类型与 f2 相同,那么我们就可以定义一个 指向f2类型 的指针c1指向fa。

那么 *c1就是 fa 了,即(*c1)== fa。所以(*c1)(5,6) 就等效于 fa(5,6)了


另一个特别之处是在c语言中 函数指针的指针 就等效于 函数指针本身。直接的说

fa与&fa相同, *fa与fa相同

我们看这个例子:
#include<iostream>
using namespace std;
typedef int f2(int,int);
int fa(int a,int b)
{
    return a+b;
}
int main()
{
    f2 *c1=&fa;
    f2 *c2=fa;//等效于fa等效与fa的地址即&fa
    cout<<(*c1)(5,6)<<endl;//输出11
    cout<<c2(5,6)<<endl;//输出11
    cout<<(*c2)(5,6)<<endl;//输出11
    return 0;
}

那么指针作为函数的参数又是怎样呢?
#include<iostream>
using namespace std;
typedef int f2(int,int);
int fa(int a,int b)
{
    return a+b;
}
void show(int a,int b,f2* c)
{
    cout<<c(a,b)<<endl;
}
int main()
{
    show(1,2,fa);//输出3
    return 0;
}

上面的把fa函数的地址赋给 函数指针c,然后调用c指向的函数。


想了解函数指针数组吗?这个例子满足你
#include<iostream>
using namespace std;
typedef int f2(int,int);
int fa(int a,int b)
{
    return a+b;
}
int fb(int a,int b)
{
    return a-b;
}
int fc(int a,int b)
{
    return a*b;
}
f2* func[3];
int main()
{
    func[0]=fa;
    func[1]=fb;
    func[2]=fc;
    for(int i=0; i<3; ++i) 
        cout<<func[i](5,6)<<endl;
    // 分别输出  11 -1 30
    return 0;
}

最后是一个扩展阅读,c++11的lambda表达式

#include<iostream>
using namespace std;
typedef int f2(int,int);
int main()
{
    auto fa=[](int a,int b){return a+b;};
    cout<<fa(5,6)<<endl;
    return 0;//输出11
}

c++ lambda表达式博客链接 https://www.cnblogs.com/DswCnblog/p/5629165.html

最后总结重要的几点

  1. 首先函数指针是一个指针,它指向一个函数(指针的值是函数的地址).
  2. 两个函数类型相同的充分必要条件是这两个函数的参数表和返回值类型相同.
  3. 在C语言中,函数名称等效函数的地址.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值