一、定義函式指標
return_type (*func_pointer)(parameter_list)
普通指標變數的定義
int * p;
char * pointer;
型別的限定都在變數前面;
函式指標型別的限定是前後都有,前面是bomacddp返回型別,後面是輸入引數。
利用typedef 可以簡化上面的表達方式。
typedef return_type (*functionpointer) (parameter_list);
functionpointer func_pointer;
這樣是不是容易讀了,和上面的功能一樣,定義了乙個返回型別為return_type ,輸入引數為parameter_list的函式指標。
二、定義返回函式指標的函式
return_type(*function(func_parameter_list))(parameter_list)
方框圈出來的表示返回型別為函式指標,剩下的部分就表示乙個function函式,輸入引數為func_parameter_list。
它就等價於 functionpointer function(func_parameter_list); 。
再看看:
void ( *signal( int sig, void (* handler)( int )))( int );
signal是乙個返回函式指標的函式,signal的輸入為int 變數和乙個函式指標。
三、函式指標的使用
#include
int add(int a, int b);
void main()
int add(int a, int b)
函式名會被隱式的轉變為指標,前面加*和&操作符都不起作用,printf的結果都是3。
四、神奇的**
int (*(*pf())())()
哇哦,這是個什麼函式!畫個框框分解它
小框表示返回的是乙個函式指標,在圈個大框,又是乙個函式指標。
它就表示,pf() 返回的是乙個函式指標,這個函式指標對應乙個無輸入引數的函式:返回值也是函式指標(對應無輸入引數的函式,返回值為int型別)。好複雜啊,有點暈!
利用typedef 簡化一下。
typedef int(*fun1) ();
typedef fun1(*fun2) ();
fun2 pf()
這樣看就舒服多了。
五、這又是什麼鬼!
(*(void(*) ())0)();
畫個框看看:
小框裡代表乙個函式指標,常數前面加括號代表型別的強制轉換。咦,它把0強制轉換成了乙個函式指標,並執行!這是什麼操作啊!
六、一段驗證**
#include
typedef int function(int, int);
typedef int(*functionpointer1) (int, int);
typedef functionpointer1(*functionpointer2) ();
int fun1(int a, int b)
functionpointer1 fun2()
functionpointer2 fun3()
int(*(*fun4())())(int, int)
void main()
函式名前面加不加*,&操作符,都是乙個效果;函式指標前面加不加*操作符是乙個效果,但是加上&操作符就代表著取指標的位址了。
可以通過typedef int 程式設計客棧function(int, int); 為一種型別的函式定義別名,但是使用的時候只能定義指標形式的變數:
function* fuction = fun1;
七、乙個問題
在stackoverflow上偶爾看到如下的問題,**如下
#include
void hello()
int hello_1()
int main(void)
執行結果是無論hello前面有多少個指標符號,都是執行hello()函式,列印「hello」。
為什麼出現這樣的結果呢:
用指標指向乙個函式是ok的,但是仍然還要被轉化為乙個function pointer。其實使用*來指向乙個函式 == call這個函式。因此無論指向多少次,仍然也是呼叫這個函式。
為什麼乙個函式會被轉化成乙個指標呢?答案就是將函式預設的轉換成函式指標,可以減少&的使用,編譯器預設的將函式轉化為函式指標,也省得你每次呼叫函式時加*呼叫函式。
哈哈,也就是我們之前說的,函式即指標。似乎有點不是很清晰,再看下面的例子
void foo() ;
int a = 2;
int* test()
int main()
上面的列子不出例外,都能正常列印我們想要的資料。
但是對於&,則要進行仔細的分析一下:
&對於乙個函式的操作,是返回乙個指標,指向函式的指標,如果在對此指標執行&也就是&&foo,則會返回error,因為&foo是乙個指標數值,也就是乙個rvalue型別,再對他進行&操作,顯然是返回error的。
&&foo //eroor
&*&*&*&*&*&*foo //ok
&******&foo //ok
本文標題: c語言中的函式指標學習筆記
本文位址: /ruanjian/c/147935.html
C語言中的函式指標學習講解
函式在記憶體中有乙個物理位置,而這個位置是可以賦給乙個指標的。一零點函式的位址就是該函式的入口點。因此,函式指標可被用來呼叫乙個函式。函式的位址是用不帶任何括號或引數的函式名來得到的。這很類似於陣列位址的得到方法,即,在只有陣列名而無下標是就得到陣列位址。1.怎樣說明乙個函式指標變數呢 為了說明乙個...
C語言中的函式指標
開啟去年6月的乙個test.cpp檔案,發現對裡面測試的函式指標幾乎沒有印象了。溫故而知新,於是重新找到ansi c 裡面的說明 除了宣告指向整型數字 雙精度型數字和c語言其他資料型別的指標外,指標也能夠被宣告指向乙個函式 包含乙個函式的位址 指向函式的指標是可能的,因為函式名像陣列名一樣,它們本身...
C語言中的函式指標
1.函式指標的定義 顧名思義,函式指標就是函式的指標。它是乙個指標,指向乙個函式。2.函式指標的使用 我們定義了乙個函式指標,但如何來使用它呢?先看如下例 include include char fun char p1,char p2 int i 0 i strcmp p1,p2 if 0 i r...