不少时候,看文章并非想很深刻的学点什么,其实大部分时候是想看看别人在捣鼓什么,有什么新鲜玩意儿,有什么能够借鉴的地方,为了增加眼界见识。我我的来讲,实际上是本身懒,不想捣鼓什么东西,仅仅想看看别人怎么捣鼓,仅做为一个看客。有一天忽然看到一我的捣鼓的东西颇有意思,就想把这我的全部捣鼓的东西看一遍。那么这个地儿就当作我捣鼓 C 和 C 相关的一个坑儿吧,不知道能坚持多久。对于 C 我属于初学者,一块儿进步。html
推荐一个捣鼓大神 bellard,这是法国的一个大神,对音视频编解码,编译原理真的不能再熟透了,说是天才一点都不过度,能和 Linus Torvalds 齐肩的人,这我的在知乎上的成就介绍连接。算法
C 中函数也是指针,叫作函数指针。能够经过这样的方式 typedef void (*callback_t)(char *)
定义一个新的类型叫 callback_t
,是一个函数指针。闭包
第一问:callback_t
前边为何要加一个星号?表明它是指针类型。函数
第二问:是一个指针能看出来了,可是为何是一个函数指针呢?是由于后边的第二对儿括号儿,若是没有后边的第二对儿括号它就是一个指针而已。ui
下边是完整代码:spa
#include <stdio.h>
typedef void (*callback_t)(char *);
void callback_test(char *str) {
printf("%s\n", str);
return;
}
void callback_main(callback_t cb) {
cb("hello");
return;
}
int main(int argc, char const *argv[]) {
callback_main((callback_t)(&callback_test));
return 0;
}
复制代码
main
函数中有一个强转的指针类型,不强转能够么?答案能够,C 中任何指针均可以相互之间强转,只要你知道你在作什么。修改为这样 callback_main(&callback_test);
也 OK。指针
完整代码以下:code
#include <stdio.h>
typedef void (*callback_t)(char *);
void callback_test(char *str) {
printf("%s\n", str);
return;
}
void callback_main(callback_t cb) {
cb("hello");
return;
}
int main(int argc, char const *argv[]) {
callback_main(&callback_test);
return 0;
}
复制代码
最上边定义了一种新的类型 callback_t
,不定义可不能够?答案也能够。只须要修改 callback_main
的入参定义就 OK 了。修改为这样 void callback_main(void (*cb)(char *))
视频
完整代码以下:htm
#include <stdio.h>
typedef void (*callback_t)(char *);
void callback_test(char *str) {
printf("%s\n", str);
return;
}
void callback_main(void (*cb)(char *)) {
cb("hello");
return;
}
int main(int argc, char const *argv[]) {
callback_main(&callback_test);
return 0;
}
复制代码
不知道还可不能够有别的变形的东西,下次想一想捣鼓一个模仿 Javascript
闭包的东西,配合 Callback。
bellard 大神的那个捣鼓素数的程序也想捣鼓捣鼓,里边有一些比较高深的算法,快速傅里叶变换之类的,跃跃欲试。他的 Code 就在这里,就那么短短的一坨,编译出来就有 220M,真的难以想象。