c/c++比较灵活的方法:回调函数和函数指针
當代碼量比較小或者需求固定的時候,可以在一個函數里綁定另一個函數,實現函數互調。但當需要經常改變函數或需要實現動態調用時,綁定的參量就不能實現。這時候需要用到函數指針和函數回調
回調函數:回調函數是一個不顯式調用的函數,通過將回調函數的地址傳給調用者從而實現調用?
函數指針:指向函數的指針,可以把函數指針傳入另一個函數作為形參,實現回調,首先聲明指針?
void?f();//這是一個函數原型,無輸入,輸出void型?
void?(*)()//左邊圓括弧中的星號是函數指針聲明的關鍵,另外兩個元素是函數的返回類型(void)和由邊圓括弧中的入口參數,注意還沒有創建函數指針?
unsigned psize = sizeof (void (*) ()); // 獲得函數指針的大小?
void?(*p) (); //聲明指針,p是指向函數的指針,該函數無輸入,返回值的類型為void。左邊圓括弧里星號后的就是指針變量名。有了指針變量便可以賦值,??
void?func()?
{?
??????? //do something?
}?
p = func; //p的賦值可以不同,但一定要是函數的地址,并且署名和返回類型相同。?
傳遞回調函數的地址給調用者:現在可以將p傳遞給另一個函數(調用者) caller(),它將調用p指向的函數,而此函數名是未知的:?
void?caller(void (*fnp) ())?
{?
??????? fnp();?
}?
void?func();?
int main()?
{?
??????p = func;??
????? caller(p); //傳遞函數地址到調用者?
}??
如果賦了不同的值給p(不同函數地址),那么調用者將調用不同地址的函數。賦值可以發生在運行時,這樣使你能實現動態綁定。?
值的內容是署名匹配的函數名和返回類型。例如:創建指針變量,只是聲明了變量類型。目前可以用這個變量類型來創建類型定義名及用sizeof表達式獲得函數指針的大小:
#include <iostream>?
int main()?
{?
????void caller(void (*) ()); //函數聲明
????void func(); //函數聲明
????void (*p) ();?//定義指針變量
????p=func; //指針變量賦值
????caller(p); //回調
????getchar();?
}???
//回調函數
void caller(void (*fnp) ())?
{?
????printf("調用成功");?
????fnp();?
}?
//被調函數
void func()?
{?
????printf("回調成功");?
}?
這是比較簡單的情況,大部分情況被調函數都有形參和返回值,回調函數也有返回值,但分析方法是相同的。
總結
以上是生活随笔為你收集整理的c/c++比较灵活的方法:回调函数和函数指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++封装、继承、多态
- 下一篇: 存储类型auto,static,exte