数组指针与函数指针


前言

由于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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值