不少時候,看文章並非想很深刻的學點什麼,其實大部分時候是想看看別人在搗鼓什麼,有什麼新鮮玩意兒,有什麼能夠借鑑的地方,爲了增加眼界見識。我我的來講,實際上是本身懶,不想搗鼓什麼東西,僅僅想看看別人怎麼搗鼓,僅做爲一個看客。有一天忽然看到一我的搗鼓的東西頗有意思,就想把這我的全部搗鼓的東西看一遍。那麼這個地兒就當作我搗鼓 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,真的難以想象。