C语言100级函数指针挑战
一个整活挑战:定义一个”指向函数的指针,该函数返回同类型的指针”,然后套 100 层。这个类型长这样(节选开头和结尾):
1 | typedef long long int (* (* (* ... (* (*a)())(void) ... ); |
这是什么鬼类型
从变量名 a 出发,用”右左法则”读这个声明:
a先被*包住:a 是一个指针- 右边跟
():指针指向一个函数 - 函数返回值又在
(* )里:返回值还是指针 - 重复第 2、3 步 100 次
也就是:a 是一个函数指针,调用它返回下一个函数指针,再调用又返回下一个……一共 100 层。
实现:自返回的函数
1 | a fun() |
fun 每次被调用就打印一个递增计数,然后把自己返回。于是 fun()()()()... 连续调用 100 次,屏幕上打出 (1)(2)(3)...(100)——每一层返回的函数指针正好是下一层要调用的。
意义
这个例子是理解复杂声明的最好练习:C 的声明语法围绕”使用形式”设计,指针、函数、数组可以无限组合。读复杂声明的钥匙是右左法则 + 从标识符出发,掌握了它,signal、qsort 这类真实函数指针声明就不再可怕。
顺便:这个 typedef 是用脚本生成的 100 层,手写是不可能的。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 寰宇体的世界!
评论
GiscusTwikoo
