带你轻松理解C/C++函数指针、函数指针数组、指向函数指针数组的指针

函数指针:

  • 定义:

  • 普通定义:
  • int (*pfunc)(int,int);首先(*pfunc)的优先级最高,所以它是一个指针,它指向的是什么呢?指向的是返回值为int,参数为int,int的函数。
  • typedef定义:
  • typedef int (*PFUNC_T)(int,int);就这么简单,下面将介绍如何使用typedef定义。
  •  
  • 例子:

  • int add(int a,int b);
  • 普通定义的函数指针赋值为:
  • int (*pfunc)(int,int) = add(非标准赋值)或者int (*pfunc)(int,int) = &add(标准赋值);(此处&可有可无,如果没有函数会隐式转换为指针,但是标准的是需要写的,比如在C++下面的非静态成员类指针,格式:[数据类型 (类名::*pfunc)(参数) = &类名::函数名;]。
  • typedef定义的函数指针赋值为:
  • PFUNC_T pfunc_t;//先定义,因为使用了typedef PFUNC_T就相当于一个数据类型了,只不过是自定义的,把它当作int理解就行了
  • pfunc_t= add或者pfunc_t= &add;。
  •  
  • 调用:

  • 普通方式第一种调用:
  • pfunc(100,100),这个是非标准的。
  • 普通方式第二种调用:
  • (*pfunc)(100,100),这个是标准的(这里将详细介绍一下,推荐写标准赋值和标准调用,下面的将一笔带过)。
  • typedef调用:
  • pfunc_t(100,100)或者(*pfunc_t)(100,100)同上面一样。

函数指针数组:

  • 定义:

  • 普通定义:
  • int (*pfunc_array[3])(int,int);首先[]的优先级最高,先与pfunc_array结合就是pfunc_array[3],这是一个有3个元素的数组,这个数组里面是装的上面东西呢?装的是指向int (*)(int,int)的函数指针。
  • typedef定义:
  • int (*PFUNC_ARRAY_T[3])(int,int);
  •  
  • 例子:

  • int add(int a,int b);
  • int sub(int a,int b);
  • int mult(int a,int b);
  • 普通定义函数指针数组赋值:
  • pfunc_array[0] = add或者pfunc_array[0] = &add;
  • pfunc_array[1] = sub或者pfunc_array[1] = ⊂
  • pfunc_array[2] = mult或者pfunc_array[2] = &mult;
  • typedef定义函数指针数组赋值:
  • PFUNC_ARRAY_T pfunc_array_t;//这里需要先定义一下
  • pfunc_array_t[0] = add或者pfunc_array_t[0] = &add;
  • pfunc_array_t[1] = sub或者pfunc_array_t[1] = ⊂
  • pfunc_array_t[2] = mult或者pfunc_array_t[2] = &mult;
  •  
  • 调用:

  • 普通调用:
  • pfunc_array[0](100,100)或者(*pfunc_array[0])(100,100);
  • typedef调用:
  • pfunc_array_t[0](100,100)或者(*pfunc_array_t[0])(100,100)

指向函数指针数组的指针:

  • 定义:

  • 普通定义:
    • 第一种方法:
    • int (*(*pfunc_a_p_1)[3])(int,int);这句话是什么意思?我们先来理解一下,首先(*pfunc_a_p_1)的优先级最高,这里就是一个指针,然后指向的是什么呢?接下来再看把(*pfunc_a_p_1)给去掉就是它所指向的内容了,int (*[3])(int,int),这里我们就知道了,(*pfunc_a_p_1)指向的是一个保存着3个元素的数组,数组里面存放的是指向返回值为int,参数为int,int的函数指针。
    • 第二种方法:
    • int (**pfunc_a_p_2)(int,int);
  • typedef定义:
    • 第一种方法:
    • typedef int (*(*PFUNC_A_P_1_T)[3])(int,int);
    • 第二种方法:

    • typedef int (**PFUNC_A_P_2_T)(int,int);

  •  

  • 例子:

  • 上面我们定义了一个int (*pfunc_array[3])(int,int);的函数指针数组
  • 普通定义指向函数指针数组的指针赋值:
    • 第一种方法:
    • int (*(*pfunc_a_p_1)[3])(int,int) = &pfunc_array;注意这里需要&pfunc_array
    • 第二种方法:
    • int (**pfunc_a_p_2)(int,int) = pfunc_array;
  • typedef定义指向函数指针数组的指针赋值:
    • 第一种方法:
    • PFUNC_A_P_1_T pfunc_a_p_1_t = &pfunc_array;
    • 第二种方法:
    • PFUNC_A_P_2_T pfunc_a_p_2_t = pfunc_array;
  • 调用:

  • 普通定义调用:
  • (*pfunc_a_p_1[0])(100,100);
  • (*pfunc_a_p_2)(100,100);
  • typedef定义调用:
  • (*pfunc_a_p_1_t [0])(100,100);
  • (*pfunc_a_p_2_t )(100,100);

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值