指向函數的指針(的數組)實例總結

jopen 8年前發布 | 9K 次閱讀 指針 C/C++開發

指向函數的指針(的數組)實例總結

前言

C語言、C++、ObjectC中都有類似指向函數的指針(的數組)的概念,用起來還是很不錯的。運用得當能起到事半功倍的效果。

百度百科中“指向函數的指針”的定義

函數指針是指向函數的指針變量。 因而“函數指針”本身首先應是指針變量,只不過該指針變量指向函數。這正如用指針變量可指向整型變量、字符型、數組一樣,這里是指向函數。如前所述,C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變量后,可用該指針變量調用函數,就如同用指針變量可引用其他類型變量一樣,在這些概念上是大體一致的。函數指針有兩個用途:調用函數和做函數的參數。

</div>

指向函數的指針

根據前面看到在百科中對 指向函數的指針 的解釋,我們能夠知道這其實就是一個指針的概念,只不過這個指針并不是指向一個數據類型,而是指向一個函數的。

這里可以借鑒指向基本數據類型的只針對概念對此理解。 指向int類型的指針變量可以這樣聲明

int a;
int *p;

對上面聲明的p指針可以這樣初始化

*p = &a;

使用p指針的方法:

*p = 10;

上述代碼就通過p指向的地址把變量a設置為10。

通過上面對指針int類型的指針的回顧,下面開始 指向函數的指針

設想有如下函數:

int process(const char *s, int value);

只是一個例子而已,不用管實現神馬功能。 如果不用指向函數的指針,直接調用應該是下面這樣子

int result = process("jileniao.net", 100);

如果換做指向函數的指針方法,則會看到如下的代碼。

int(*p_func)(const char *s, int value);
p_func = process; 

實際調用時,將會是:

int result = (*p_func)("jileniao.net", 100);

記住 指向函數的指針 在使用時,原函數名就是在內存中所占的地址(相當于取地址符&)。

指向函數的指針的數組

本概念,結尾詞落在數組上,說明無論前面是神馬東西,最終這必然是一個數組,而數組中的每個元素就是上面所說的 指向函數的指針

知道了這個本質,用起來也就沒有太大的問題了。

請看實例:

int process1(const char *s, int value);
int process2(const char *s, int value);
int process3(const char *s, int value);
int process4(const char *s, int value);
int process5(const char *s, int value);
int process6(const char *s, int value);
int process7(const char *s, int value);
int process8(const char *s, int value);
int process9(const char *s, int value);

如上,有若干同樣參數,同樣返回值的一系列函數,想要在某種情況下依次調用,不通過 指向函數的指針的數組 ,可以順序寫一遍就OK了。但若想做的更優雅一些, 指向函數的指針的數組 就可以派上用場了。

int (*p_funcions[9])(const char *s, int value);

上面就已經聲明了一個數組長度為9的 指向函數的指針的數組 ,繼續往下看是對其初始化。

p_funcions[0] = process1;
p_funcions[1] = process2;
p_funcions[2] = process3;
p_funcions[3] = process4;
p_funcions[4] = process5;
p_funcions[5] = process6;
p_funcions[6] = process7;
p_funcions[7] = process8;
p_funcions[8] = process9;

想要使用這個數組,則可以這樣。

int results[9];
for (int i = 0; i < 9; ++i) {
    results[i] = (*p_funcions[i])("jileniao.net", 100);
}

文末,歡迎留言提出意見。謝謝!

</div>

來自: http://jileniao.net/cplusplus-function-pointer.html

</code></code></code></code></code></code></code></code></code></code></code>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!