看完後對函式指標有個重新認識

2022-05-04 04:15:11 字數 2598 閱讀 8469

1. 首先,在c語言中函式是一種function-to-pointer的方式,即對於乙個函式,會將其自動轉換成指標的型別.如:

#includevoid fun() 

int main()

這三個值的結果是一樣的. 其實對於最後的那個*fun, 即使前面加上很多個*號, 其結果也不變, 即**fun, ***fun的結果都是一樣的.對於這個問題, 因為之前講過函式是一種 function-to-pointer方式, 其會自動轉換成指標的型別,&fun是該函式的位址, 為指標型別, fun是乙個函式, 會轉換成其指標型別, 而對於*fun, 由於fun已經變成了指標型別,

指向這個函式, 所以*fun就是取這個位址的函式, 而又根據function-to-pointer, 該函式也轉變成了乙個指標, 所以以此類推, 這三個值的結果是相同的.

2. 如何呼叫乙個位址上的函式

如果知道了乙個函式所在的位址, 可以將其強制轉化成某一種型別的函式指標, 然後再根據這個指標去呼叫這個位址的函式. 如:

#includevoid f(int i) 

int main()

使用(void (*)(int))的方式可以將乙個位址轉換成乙個帶int引數且沒有返回值的函式的指標型別,然後再去呼叫, 由於第1點中講的function-to-pointer, 所以最後兩條語句中加與不加那個*號效果都是一樣的.在嵌入式方面經常用到這種方式.

3. 函式指標陣列的用法.

有時候需要定義乙個陣列, 其內容為一系列的函式指標, 然後對其進行呼叫, 如: 

#includeint max(int v1, int v2) 

int min(int v1, int v2)

int sum(int v1, int v2)

int main()

雖然感覺這種方法有點累贅, 但是也算是一種使用的方式, 所以介紹一下. 

4.返回乙個指向陣列的指標的方式

可以讓函式返回乙個指向陣列的乙個指標, 如: 

#include#includeint (*p())[10] //p是乙個函式,它的返回值是乙個指標,該指標指向乙個整型陣列,這個陣列的長度是10;

for(i = 0; i < 10; i++)

*(*m+i) = i+1;

return m;

} int main()

這種方式中,int (*a)[10]是乙個指向一維陣列的乙個指標, 而p()也是返回乙個指向一維陣列的乙個指標.

5.返回乙個函式指標的指標

對這個問題, signal()函式是最好的例子, 

void (   *signal (  int signo, void (*func)(int)  )    )(int);

很多朋友剛開始看這個函式定義的時候是不太懂, 其實可以一步一步地慢慢看, 我以前是這樣分析的, 希望能對大家有用. 

int (*p)();
這是乙個函式指標, p所指向的函式是乙個不帶任何引數, 並且返回值為int的乙個函式.

int (*fun())();
這個式子與上面式子的區別在於用fun()代替了p,而fun()是乙個函式,所以說就可以看成是fun()這個函式執行之後,它的返回值是乙個函式指標,這個函式指標(其實就是上面的p)所指向的函式是乙個不帶任何引數,並且返回值為int的乙個函式.所以說對於 

void (*signal(int signo, void (*fun)(int)))(int);
就可以看成是signal()函式(它自己是帶兩個引數,乙個為整型,乙個為函式指標的函式), 而這個signal()函式的返回值也為乙個函式指標,這個函式指標指向乙個帶乙個整型引數,並且返回值為void的乙個函式. signal函式返回的其實是指向以前的訊號處理程式的指標, 所以舉乙個例子來說明返回指向函式的指標的用法,如: 

#include#include#includevoid sig_fun2(int signo) 

void sig_fun1(int signo)

int main()

(signal(sigusr1, sig_fun2))(30);

printf("done\n");

return 0;

}

6. 使用函式指標作為引數的情況

在函式的引數中, 可能會帶有乙個函式指標, 這在signal()函式中是出現了的, 另外再寫個例子如: 

#includeint max(int v1, int v2) 

int min(int v1, int v2)

int sum(int v1, int v2)

int fun(int a, int b, int (*call)(int, int))

int main()

其實在很多排序函式中就是使用的這個引數為函式指標的方式來進行呼叫的.

不懂函式指標與指標函式?看完這篇文章就能懂

當學習陣列指標與指標陣列的時候很是讓人頭疼,到底是陣列還是指標?深入學習到函式的時候發現既然有函式指標與指標函式這麼個更讓人頭疼的難以區分的問題。當去看一眼定義的時候,噼里啪啦一串又長又繞,真讓人崩潰!好不容易記住了結果沒過幾天就又忘記了,那麼今天你看的這篇文章就能理解並區別兩者。簡單的來說,其本質...

指標函式和函式指標有什麼區別

1,這兩個概念都是簡稱,指標函式是指帶指標的函式,即本質是乙個函式。我們知道函式都又返回型別 如果不返回值,則為無值型 只不過指標函式返回型別是某一型別的指標。其定義格式如下所示 返回型別識別符號 返回名稱 形式參數列 返回型別可以是任何基本型別和復合型別。返回指標的函式的用途十分廣泛。事實上,每乙...

指標函式和函式指標有什麼區別

指標函式和函式指標有什麼區別 1,這兩個概念都是簡稱,指標函式是指帶指標的函式,即本質是乙個函式。我們知道函式都又返回型別 如果不返回值,則為無值型 只不過指標函式返回型別是某一型別的指標。其定義格式如下所示 返回型別識別符號 返回名稱 形式參數列 返回型別可以是任何基本型別和復合型別。返回指標的函...