深刻解析函數指針與前往函數的指針。本站提示廣大學習愛好者:(深刻解析函數指針與前往函數的指針)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析函數指針與前往函數的指針正文
先看看以下兩個代碼:
1:出自STL-SGI源碼<stl_alloc.h>
static void (*__set_malloc_handler(void (*__f)()))()
{
void (*__old)()=__malloc_alloc_oom_handler;
__malloc_alloc_oom_handler=__f;
return (__old);
}
2:Linux下的<sginal.h>
void (*signal (int sig_num, void (*handler)(int))) (int)
作為一個C/C++高手或許一看就明確,上面來剖析一下,剖析的辦法采取的是從裡向外的剖析法
關於例子1剖析以下:
1)最外面是void (*_f)()解釋_f是一個指針,與左邊的()聯合,解釋其是一個函數,在與最右邊的void聯合,注解其是一個函數指針。
2)用typedef對void (*_f)()停止一下界說,便利前面的剖析
Typedef void (*F)()
3)因而下面的代碼可以釀成以下的情勢
Static void (*__set_malloc_handler(F f))()
4)再從裡向外剖析__set_malloc_handler(F f)先與()聯合注解其是一個函數,參數類型為F f,再於右邊的*聯合,注解函數前往的是一個指針類型,即static void (*)(),是以是一個函數指針
5)綜上可以獲得代碼函數名為__set_malloc_handler,接收一個前往值為空,參數為空的函數指針作為參數,最初前往一個函數指針,該指針異樣前往值與參數均為空,很繞口:)
關於例子2剖析以下
1)從裡向外外面是void (* handler)(int)看過列子1,很輕易曉得這是一個函數指針,前往值為空,參數為空
2)對void (*handler)(int)停止宏界說,以便利懂得
Typedef void (*Handle)(int)
3)因而函數就釀成了void (*signal(intsig_num,Handler handler))(int)
4)從裡向外剖析signal(int sig_num,Handlerhandler)是一個函數,帶兩個參數,前往值是*,等於一個指針,前往值為void(*)(int)異樣是一個Handler類型的函數指針
5)綜上所述,代碼2的函數名是signal,接收兩個參數,前往一個Handler類型的函數指針。
其他代碼的剖析相似,以下幾例:
1:void *(*(*f)(int))[10];
剖析以下(*(*f)(int)->void *(*)[10]
2:void *(*f)(int)[10]
剖析以下(*f)(int)->void *[10]
還有一些根本上都是相似的變形