论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
大数据
›
数据仓库与分析
›
C 语言布局体中的函数指针与 Kotlin 高阶函数的对比 ...
C 语言布局体中的函数指针与 Kotlin 高阶函数的对比
石小疯
论坛元老
|
7 天前
|
显示全部楼层
|
阅读模式
楼主
主题
1854
|
帖子
1854
|
积分
5562
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
在学习 C 语言的过程中,很多 Java/Kotlin 背景的
开发
者都会对布局体中出现的“函数指针”感到生疏。特别是当看到如下代码时:
struct Animal {
void (*speak)(void);
};
void dogSpeak() {
printf("Woof!\n");
}
int main() {
struct Animal dog;
dog.speak = dogSpeak;
dog.speak();
return 0;
}
复制代码
这段代码中,布局体 Animal 中的 speak 并不是一个平常变量,而是一个“函数指针”。它的作用是:
指向一个函数,然后在合适的时机调用它
。这其实与我们在 Kotlin 中使用高阶函数的目标如出一辙。
一、C 中布局体里的函数指针
函数指针的语法大概略显复杂,但本质很简单:
void (*speak)(void) 表示一个函数指针,它指向一个没有参数、返回值为 void 的函数。
给它赋值时,只需要提供函数名(不加括号)。
调用时使用 布局体变量.函数指针() 的方式实行。
函数指针的最大利益是:
可以将函数“作为变量”赋值和传递,从而实现雷同回调、战略模式等逻辑。
二、Kotlin 中的高阶函数
Kotlin 提供了原生的高阶函数支持,好比下面这个例子:
fun runTwice(block: () -> Unit) {
block()
block()
}
fun main() {
runTwice { println("Hello") }
}
复制代码
这里,block: () -> Unit 就是一个“函数类型的参数”,你可以将任何匹配这个署名的 lambda 或函数传入它。
Kotlin 的高阶函数与 C 的函数指针的本质是一样的:
将函数作为“值”举行传递、赋值和调用
。
三、类比与思索
概念C 语言Kotlin函数作为变量函数指针高阶函数(函数类型)放入布局/对象中布局体中的函数指针成员类/对象中的函数属性调用方式对象.函数指针()对象.函数()使用目标实现回调、战略、接口模仿回调、DSL、扩展性逻辑
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
石小疯
论坛元老
这个人很懒什么都没写!
楼主热帖
解决图片无法设置hover,以设置图片的 ...
SQL的多表查询
C# GDI+ 画心形 跳动动画
解决OpenCV的imread/imwrite在Qt环境不 ...
几个函数的使用例子:更新VBRK-XBLNR, ...
Hive安装与启动
qrtz表初始化脚本_mysql
MySQL基础(DDL、DML、DQL)
堆Pwn:House Of Storm利用手法
OpenHarmonyOs / LiteOs-a 开发环境搭 ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
主机安全
分布式数据库
数据安全
物联网
运维.售后
Postrge-SQL技术社区
图数据库
Oracle
SQL-Server
公有云
快速回复
返回顶部
返回列表