一、函數指針
1. 函數的定義
return_type function_name(parameter list) {
function_body
}
return_type: 傳回值,函數一定有傳回值,傳回值為用return關鍵字。如果void類型傳回值,則直接調用return即可;
function_name: 函數名稱
parameter list: 參數清單
function_body: 函數執行範式
例如聲明add函數
int add(int a, int b) {return a + b;}
定義傳回值為int的函數,名稱add,參數清單為int類型的a,b,函數執行範式:a + b.
return回a + b的結果
2. 函數指針聲明
return_type (*function_name) (arg0, arg1, arg2, ...);
function_name: 函數名定義為指針類型,即function_name是一個指向函數的指針。
注意,不能定義為
return_type* function_name (arg0, arg1, arg2, ...);
這是傳回值為指針的函數,即傳回結果為指針類型的函數。
3. 第一個函數指針程式
hello_world.cpp
=========================
[cpp] view plain copy
- #include <cstdio>
- void function(const char *text) {
- printf("%s", text);
- }
- int main(void) {
- void (*pfun)(const char *) = &function;
- (*pfun)("Hello, world.\n");
- return 0;
運作指令編譯
lucky@lucky-macbook:cplusplus_callback_function$ g++ hello_world.cpp -o hello
lucky@lucky-macbook:cplusplus_callback_function$ ./hello
Hello, world.
二、函數式回調
1. 在c/c++允許函數指針作為函數參數傳遞
例如: void invoke_function(void (*callback_func)(parameter list));
函數invoke_function的參數是函數指針callback_func,對于不熟悉c的開發者一開始會不習慣void (*callback_func)(parameter list)這種聲明變量的方式。這樣聲明變量相當于
#typedef void (*CALLBACK_FUNCTION)(parameter list)
CALLBACK_FUNCTION callback_func;
2. 簡單的回調函數程式
function_callback.cpp
- #include <cstring>
- #define TEXT_LEN 128
- /**定義函數lucky*/
- void lucky(char *outName, size_t len) {
- strncpy(outName, "Hi, I'm lucky.\n", len);
- void jacky(char *outName, size_t len) {
- strncpy(outName, "Hi, I'm jacky, Nice to meet you.\n", len);
- void penny(char *outName, size_t len) {
- strncpy(outName, "Just call me penny, I like football.\n", len);
- void introduce(void (*person)(char *, size_t len)) {
- char szText[TEXT_LEN] = {0};
- (*person)(szText, TEXT_LEN);
- printf("%s", szText);
- typedef void (*FUNC_NAME)(char *, size_t);
- // 直接調用函數指針,注意使用了取位址符号&
- introduce(&lucky);
- // 直接定義變量方式使用函數指針
- void (*pfun)(char *, size_t) = &jacky;
- introduce(pfun);
- // 先用typedef定義函數指針類型,再用改類型定義對應的函數指針變量,最後對變量指派并傳參調用
- FUNC_NAME pfunc2 = &penny;
- introduce(pfunc2);
編譯并輸出結果
lucky@lucky-macbook:cplusplus_callback_function$ g++ function_callback.cpp -o funcallback
lucky@lucky-macbook:cplusplus_callback_function$ ./funcallback
Hi, I'm lucky.
Hi, I'm jacky, Nice to meet you.
Just call me penny, I like football.
http://blog.csdn.net/sweettool/article/details/72578801