深入理解函数指针和函数数组
深入理解函数指针和函数数组
理解函数指针首先理解它的类型,首先函数指针是个指针,他指向一个函数。其次与普通变量指针相同重要的一点是函数指针的类型,如果两个函数的参数个数、参数表、返回值类型都相同,则这两个函数是同一个类型。换句话说同一类型的函数指针可以指向这两个函数
我们先看一个例子:
#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
最后总结重要的几点
- 首先函数指针是一个指针,它指向一个函数(指针的值是函数的地址).
- 两个函数类型相同的充分必要条件是这两个函数的参数表和返回值类型相同.
- 在C语言中,函数名称等效函数的地址.