前言
由于C++中函数指针与数组指针具有一定相似性,故采用二者作为类比
提示:以下是本篇文章正文内容,下面案例可供参考
一、函数类型是什么?
如果我们定义一个数组
int a[3]={1,2,3};
那么这个数组的类型是int [3]。
同样,我们定义一个函数
void fun(int x)
那么这个函数类型是void(int)
二、函数指针类型是什么?
同样用数组指针作为引入
int a[3]={1,2,3};
那么数组指针的类型是
int (*) [3]//这是一个指向一个数组的指针,该数组有三个元素,每个元素是int型
注意int (*a) [3]和int* a [3]的概念完全不同,int * [3]代表的是这个数组有三个元素,每个元素的类型是int*
同理定义一个函数,
void inc(int x)
{}
那么这个函数指针的类型是void ( * )(int)
注意void * (int)不代表函数指针,他表示一个函数,这个函数传入一个int参数,返回一个int *指针类型
2.函数指针有什么用
在高阶函数中,可以将函数指针作为高阶函数的参数
int addd(int a,int s)
{
a+=s;
std::cout<<a<<std::endl;
return a;
}
using k= int(int,int);
void g(k*y,int x,int z)//定义一个高阶函数,返回值和参数值都可以是函数
{
int a=y(x,z)+1;
std::cout<<a<<std::endl;
}
int main()
{
k* fun=&addd;
fun(1,2);
g(fun,1,2);
打印出
3
3
4
类型退化
在数组中
int a[3];
auto b=a;
b会退化成一个指针,他指向数组的第一个元素。
同理,函数自动复制时也会从函数类型转化为函数指针类型。
int inc(int x);
auto fun=inc;//fun退化为一个函数指针类型
这个有什么用呢?
我的理解是他可以用于传入函数的类型自动转化。
void demo(k x)//定义一个高阶函数,形参类型是k
{
std::cout<<1<<std::endl;
}
int main()
{
demo(addd); //我可以直接传入一个函数作为实参,这个函数在传递时会自动转化为函数指针类型,因为函数不能拷贝
k* fun=&addd;
demo(fun);//当然也可以直接传入一个函数指针类型
demo(&addd);//或者这样写也一样
}
所以void demo(k x)和void demo(k* x)是一样的。函数和函数指针在需要时是可以自动转化的
同样,高阶函数返回的也应该是一个函数指针。
int inc1(int x)
{
x+=1;
return x;
}
int dec1(int x)
{
x-=2;
return x;
}
auto func(bool m)
{
if (m==true)
return inc1;
else return dec1;
}
int main()
{
std::cout<<(*func(0))(100);//返回的fun(0)的类型是函数指针,因此对他解引用后得到函数,再对函数赋值
}
打印出98