C语言之指向函数的指针

这里介绍了关于指向一维数组的指针, 相关内容可以参考该文.
本文将简要介绍指向函数的指针.

  • 如何声明一个指向函数的指针?
void print(int num); // 声明函数
void (*funptr)(int) = print; // 声明指向函数的指针, 该函数接受一个int参数, 返回void, 并用print函数的地址初始化
  • 函数指针类型的通用形式: 返回类型 (* 可选限定符) (形参列表)
    比如 funptr 的类型是 void (*) (int) , 其中可选的限定符有 constvolatile

  • 函数名是什么?
    函数名被使用时总是由编译器将它转换为该函数类型的函数指针, 比如 print 的类型就是 void () (int) 所以可以用 print 初始化 funptr. 当使用 & 时只是显示的说明了编译器的转换操作, 所以 print&print 都是 void () (int) 类型.

    注意: 函数名与数组名在这点上的区别.

  • 如何通过指向函数的指针调用函数?
    事实上有三种调用方式可选:

print(10); // (1) 使用函数名调用print函数
(*funptr)(10); // (2) 使用指向函数指针解引调用print函数`
funptr(10); // (3) 使用指向函数指针直接调用print函数

(1)的执行过程是函数名print首先被转换成一个指向函数的指针, 该指针指向print函数在内存中的位置, 然后调用操作符调用print函数, 执行开始于这个位置的代码.
(2)的执行过程是解引操作将funptr转换为函数名, 然后执行(1)的操作, 显然解引操作不是必需的, 函数调用操作符需要的是一个指向函数的指针.
(3)的执行过程是函数调用操作符直接调用函数.

  • 声明 “指向函数的指针” 的指针
    指向函数的指针本质上仍然是一种指针, 我们可以按照二级指针声明指向它的指针.
void print(int num); // 声明函数
void (*funptr)(int) = &print; // 声明指向函数的指针
void (**funpptr)(int) = &funptr; // 声明 "指向函数的指针" 的指针
(**funpptr)(10); // 通过二级指针调用print
  • 声明元素类型为 “指向函数的指针” 的数组
    同样, 如果具有多个类型一样的指向函数的指针, 我们可以将它们放在一个数组中.
void print(int num); // 声明函数
void (*funptr)(int) = &print; // 声明指向函数的指针
void (*funptrarray[])(int) = funptr; // 声明元素类型为"指向函数的指针"的数组, 数组大小为1, funptrarray[0]用funptr初始化
(*funptrarray[0])(10); // 调用print
(**funptrarray)(10); // 等价的调用print

这种技巧也称为转移表.

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值