typedef void(*Fun) (void)是什麼意思?
還有很多不同的用法,typedef void (*fun)( void ) ;
#include&
typedef void (*fun)(void) ;
void Fun1(void)
{
printf("Fun1 Run
");
}
void Fun2(void)
{
printf("Fun2 Run
");
}
int main()
{
fun p;
p=Fun1; //兩者類型匹配。
p(); //
p=Fun2;
(*p)();//這兩種p的表示方法是等價的
return 0;
}
其實就是函數指針的用法
下面這篇文章講的很詳細http://blog.csdn.net/qll125596718/article/details/6891881
#include&
typedef void (*fun)(void) ;
char (*pFun)(int);
char glFun(int a)
{
return char(a);
}
int main()
{
pFun = glFun;
printf("%c
",(*pFun)(2));
printf("%c
",pFun(2));
return 0;
}
第一行定義了一個指針變數pFun。首先我們根據前面提到的「形式1」認識到它是一個指向某種函數的指針,這種函數參數是一個int型,返回值是char類型。只有第一句我們還無法使用這個指針,因為我們還未對它進行賦值。
第二行定義了一個函數glFun()。該函數正好是一個以int為參數返回char的函數。我們要從指針的層次上理解函數——函數的函數名實際上就是一個指針,函數名指向該函數的代碼在內存中的首地址
然後就是main()函數了,它的第一句您應該看得懂了——它將函數glFun的地址賦值給變數pFun。main()函數的第二句中「*pFun」顯然是取pFun所指向地址的內容,當然也就是取出了函數glFun()的內容,然後給定參數為2。定義一個函數指針類型。
這個函數參數是void返回值也是void
void (*Fun)(void);假如就只是寫上這樣的一句代碼,顯然這就是定義了一個變數Fun。這個Fun變數是一個指針,指向 返回值和參數都是空的函數的指針。如果這樣呢?
typedef void (*Fun)(void);
這樣的話Fun代表的就不是變數了,而是代表了一種新的類型。用Fun來定義一個變數 如Fun p;上面這句代碼就定義了一個 指針 這個p指針和 最上面的那個Fun是同一個類型的變數。(p是指向 返回值和參數都是空的函數的指針)。總的來說 typedef是用來定義變數型的。
函數指針,用typedef比較獨特,在定義中間,不像其他類型在最後。
說一說我的理解。c的函數在被調用的時候是執行了一條轉移指令,這條指令包含要轉移到的地方的數據。和變數一樣,變數代表了一個地址,當你引用一個變數的時候,計算機會把這個地址的數據拿出來參與運算,那麼函數名也是一樣,函數名代表的是一段代碼的入口地址,引用了這個函數,那麼計算機會使用轉移指令轉移到函數名代表的這個地址。
這樣的代碼相當於定義了一種類型,這個類型具有下面的特徵:他是一個函數,沒有返回值,沒有參數。因為處理器在進行上下文切換(轉移)的時候要進行現場保護(保存當前寄存器的值,因為函數調用完成之後可能還會用到寄存器中的值),不同的函數對現場保護的內容可能不一樣(比如某個函數只用了一個寄存器,所以為了性能只保存了一個寄存器的值,但是另一個函數用了所有寄存器的值,所以保存了所有寄存器的值),傳入的參數使用的棧也不一樣(有的函數傳入了一個參數,那麼棧需要彈出一次,有的函數沒有參數,那麼不需要出棧),相同類型的函數保證了現場保護的內容是一樣的,參數的形式也是一樣的。
這樣可以像用指針引用數據一樣使用函數。比如你可以在一個函數的參數中傳入不同的函數指針使函數做出不同的動作。比如你可以寫出下面的代碼typedef void (*fun)(void) ;
int main(void)
{
int i=0;
fun array[256]=......//函數指針數組的內容需要你定義
...//中間可能改變了i的值
my_func(array[i]);
}
void my_func(fun p)
{
p();//根據傳入的函數不同,該函數可以做出不同的動作
}
Fun 這個類型是這樣的: void (*)(void),代表 pointer to a function taking nothing and returning nothing.當然,如果返回值較複雜的話,用typedef不太容易看出來,推薦用C++11新加的特性using Fun = auto (*)(void) -&> void;在例子中的情況下,就顯得有點得不償失了。
推薦閱讀:
※C++的語言設計有哪些缺陷?
※如何入門Python3?
※為什麼 Python 不支持函數重載?其他函數大部分都支持的?
※請問要開發安卓,需要考什麼證?
※精通C++之後是否寫代碼就是體力活了?