關於指標與函式的幾點小結

2021-04-22 02:15:12 字數 2686 閱讀 8525

關於指標與函式的幾點小結

心血來潮, 想對函式指標的幾個用法小結一下, 都是平常容易見到的, 如果還有其它不覺的用法也請朋友們不吝賜教.

若有錯誤之處,還請指正.

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

#include

void fun()

int main()

這三個值的結果是一樣的. 其實對於最後的那個*fun, 即使前面加上很多個*號, 其結果也不變, 即**fun, ***fun的結果都是一樣的. 對於這個問題, 因為之前講過函式是一種

function-to-pointer方式, 其會自動轉換成指標的型別, &fun是該函式的位址, 為指標型別, fun是乙個函式, 會轉換成其指標型別, 而對於*fun, 由於fun已經變成了指標型別, 指向這個函式, 所以*fun就是取這個位址的函式, 而又根據function-to-pointer, 該函式也轉變成了乙個指標, 所以以此類推, 這三個值的結果是相同的.

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

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

#include

void f(int i)

int main()

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

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

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

#include

int max(int v1, int v2)

int min(int v1, int v2)

int sum(int v1, int v2)

int main()

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

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

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

code:

#include

#include

int (*p())[10]

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

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

return m;

}

int main()

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

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

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

code:

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

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

int (*p)();

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

int (*fun())();

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

code:

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

就可以看成是signal()函式(它自己是帶兩個引數,乙個為整型,乙個為函式指標的函式), 而這個signal()函式的返回值也為乙個函式指標,這個函式指標指向乙個帶乙個整型引數,並且返回值為void的乙個函式.

signal函式返回的其實是指向以前的訊號處理程式的指標, 所以舉乙個例子來說明返回指向函式的指標的用法,如:

code:

#include

#include

#include

void sig_fun2(int signo)

void sig_fun1(int signo)

int main()

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

printf("done/n");

return 0;

}

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

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

code:

#include

int 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.首先,在c語言中函式是一種function to pointer的方式,即對於乙個函式,會將其自動轉換成指標的型別.如 include void fun int mai...

關於函式指標與指標函式

函式指標 在程式執行中,函式 是程式的演算法指令部分,它們和陣列一樣也占用儲存空間,都有相應的位址。可以使用指標變數指向陣列的首位址,也可以使用指標變數指向函式 的首位址,指向函式 首位址的指標變數稱為函式指標。1 函式指標定義 函式型別 指標變數名 形參列表 函式型別 說明函式的返回型別,由於 的...

函式指標 關於函式指標與指標函式

指標函式顧名思義,本質還是函式,不同的是改函式的返回型別為指標型別。接下來我們舉個例子。include using namespace std char output intmain 這裡的char output 就是個指標函式 char 的函式,即返回值為char 型別的。這裡的 如果gcc g ...