C語言中的函式指標學習筆記

2022-09-28 03:00:14 字數 2687 閱讀 6538

一、定義函式指標

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...